Как List <T>.Contains () находит подходящие элементы? - PullRequest
14 голосов
/ 13 февраля 2012

У меня есть список автомобильных объектов

 List<Car> cars = GetMyListOfCars();

, и я хочу увидеть, есть ли в списке автомобиль

if (cars.Contains(myCar))
{
}

Что содержит Contains, чтобы выяснить, является ли myCarв списке.Делает ли это "ToString ()" на моем объекте автомобиля.Использует ли он метод Equals (), gethashcode ()?

Я вижу, что могу передать свой собственный IEqualityComparer, чтобы заставить мою собственную реализацию, но просто хотел понять, что он делает по умолчанию.

Ответы [ 3 ]

18 голосов
/ 13 февраля 2012

Прямо из MSDN - Список . Содержит:

Этот метод определяет равенство с помощью средства сравнения по умолчанию, определенного в реализации объекта IEquatable (Of T) .Equals метод для T (тип значений в списке).

Этот метод выполняет линейный поиск;следовательно, этот метод является операцией O (n), где n равно Count.

Таким образом, в конечном итоге это зависит от того, как T реализует IEquatable.Equals () .Для большинства объектов это будет сравнительное сравнение, если оно не переопределено.То же место в памяти - это тот же объект.

5 голосов
/ 13 февраля 2012

Используется Equals ()

Этот метод определяет равенство, используя равенство по умолчанию компаратор, как определено реализацией объекта IEquatable (Of T). Метод Equals для T (тип значений в списке).

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

1 голос
/ 13 февраля 2012

Contains вернет true, как только сможет, то есть когда будет найден первый элемент, соответствующий критериям.

A false будет возвращено после того, как все элементы были повторены.

В отношении как это делает это - он будет использовать равенство ссылок для ссылочных типов, если вы не переопределите Equals.

...