2010-12-14 27 views
74

Với một bộ sưu tập đồ vật khổng lồ, có sự khác biệt về hiệu suất giữa các mục sau không?LINQ Ring: Any() vs Contains() cho Bộ sưu tập lớn

Collection.Contains:

myCollection.Contains(myElement) 

Enumerable.Any:

myCollection.Any(currentElement => currentElement == myElement) 
+6

Một bộ sưu tập 10'000.000 int. người chiến thắng là chứa 300%. nhưng nó xứng đáng để xem xét các phương sai được đề cập dưới đây. – SDReyes

+1

Điều này có vẻ hiển thị một sự tương phản rõ rệt giữa hai: http://thedailywtf.com/Articles/State-of-the-UNION.aspx –

Trả lời

98

Chứa() là phương pháp thể hiện và hiệu suất của nó phụ thuộc phần lớn vào bộ sưu tập. Ví dụ, Contains() trên một List là O (n), trong khi Contains() trên một HashSet là O (1).

Bất kỳ() là một phương pháp mở rộng, và chỉ đơn giản là đi qua bộ sưu tập, áp dụng các đại biểu trên mọi đối tượng. Do đó nó có độ phức tạp của O (n).

Bất kỳ() nào linh hoạt hơn tuy nhiên vì bạn có thể chuyển giao một đại biểu. Chứa() chỉ có thể chấp nhận một đối tượng.

+20

'Contains' cũng là một phương thức mở rộng đối với' IEnumerable '(mặc dù một số bộ sưu tập có phương thức' Contains' riêng của chúng). Như bạn nói, 'Any' linh hoạt hơn' Contains' vì bạn có thể chuyển nó thành vị từ tùy chỉnh, nhưng 'Contains' * có thể * hơi nhanh hơn vì nó không cần thực hiện lời gọi đại biểu cho mỗi phần tử. – LukeH

8

Nó phụ thuộc vào bộ sưu tập. Nếu bạn có một bộ sưu tập theo thứ tự thì Contains có thể thực hiện tìm kiếm thông minh (nhị phân, băm, b-tree, vv) trong khi với Any() bạn về cơ bản bị liệt kê cho đến khi bạn tìm thấy nó (giả sử LINQ to Objects)

Cũng lưu ý rằng trong ví dụ của bạn, Any() đang sử dụng toán tử "==" sẽ kiểm tra tính bình đẳng tham chiếu trong khi Contains sẽ sử dụng phương thức IEquitable hoặc Equals() có thể được overriden.

+1

Với .Bạn có thể dễ dàng so sánh các thuộc tính. Với .Contains bạn chỉ có thể so sánh các đối tượng và bạn cần thêm một IEqualityComparer để so sánh các thuộc tính. – msfanboy

+1

@ msfanboy: Đúng vậy, nhưng câu hỏi cụ thể về hiệu suất và cho thấy so sánh toàn bộ đối tượng. Vì vậy, tôi không nghĩ rằng nó có liên quan ở đây. – tster

4

Tôi cho rằng điều đó phụ thuộc vào loại myCollection được áp dụng như thế nào Contains() được triển khai. Ví dụ, nếu một cây nhị phân được sắp xếp, nó có thể tìm kiếm thông minh hơn. Ngoài ra, nó có thể xem xét hàm băm của phần tử. Any() mặt khác sẽ liệt kê thông qua bộ sưu tập cho đến khi phần tử đầu tiên thỏa mãn điều kiện được tìm thấy. Không có tối ưu hóa nếu đối tượng có phương pháp tìm kiếm thông minh hơn.

Các vấn đề liên quan