2012-02-13 30 views
11

Tôi có một danh sách các đối tượng xeDanh sách <T> .Contains() Tìm các mục phù hợp như thế nào?

List<Car> cars = GetMyListOfCars(); 

và tôi muốn để xem nếu một chiếc xe nằm trong danh sách

if (cars.Contains(myCar)) 
{ 
} 

những gì hiện Chứa Dùng để tìm ra nếu myCar có trong danh sách. Nó có làm một "ToString()" trên đối tượng xe hơi của tôi không. Nó có sử dụng phương thức Equals(), gethashcode() không?

Tôi thấy tôi có thể vượt qua trong IEqualityComparer của riêng mình để buộc thực hiện của riêng tôi nhưng chỉ muốn hiểu những gì nó làm theo mặc định.

+1

ToString trả về tên của loại khi không ghi đè nên nó sẽ không thể là một cách tốt để so sánh các mặt hàng :) –

+0

Bằng cách này, bạn không thể vượt qua của riêng bạn 'IEqualityComparer ' vào 'Danh sách .Contains'. Bạn * có thể * vượt qua so sánh của riêng bạn vào phương pháp mở rộng 'Contains' của LINQ, hoạt động khá vui vẻ với' List '. – LukeH

Trả lời

15

Trực tiếp từ MSDN - List<T>.Contains:

Phương pháp này xác định sự bình đẳng bằng cách sử dụng comparer bình đẳng mặc định , theo định nghĩa của việc thực hiện của đối tượng của IEquatable (Of T) phương pháp Equals cho T (loại giá trị trong danh sách).

Phương pháp này thực hiện tìm kiếm tuyến tính; do đó, phương pháp này là một hoạt động O (n), trong đó n là Đếm.

Vì vậy, cuối cùng, tùy thuộc vào cách T triển khai IEquatable.Equals(). Đối với hầu hết các đối tượng, đây sẽ là một so sánh tham chiếu, trừ khi overriden. Cùng một vị trí trong bộ nhớ là cùng một đối tượng.

+0

Một ngoại lệ cho điều này là nếu bạn tìm kiếm 'null', trong trường hợp đó' Contains' chỉ thực hiện kiểm tra 'item == null' trực tiếp thay vì sử dụng phép so sánh. – LukeH

+0

@LukeH True - cảm ơn vì đã nhắc đến điều đó. – Yuck

1

Contains sẽ trả về true ngay khi có thể - đó là khi mục đầu tiên phù hợp với tiêu chí được tìm thấy.

A false sẽ được trả lại sau khi tất cả mục đã được lặp lại.

Liên quan đến cách nó thực hiện điều đó - nó sẽ sử dụng bình đẳng tham chiếu cho các loại tham chiếu nếu bạn không ghi đè Equals.

4

Nó sử dụng Equals()

Phương pháp này xác định sự bình đẳng bằng cách sử dụng comparer bình đẳng mặc định , theo định nghĩa của việc thực hiện của đối tượng của IEquatable (Of T) phương pháp Equals cho T (loại giá trị trong danh sách).

http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx

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