Список> .Contains () не работает - PullRequest
5 голосов
/ 15 марта 2012

У меня есть следующий код:

List<List<int>> list = new List<List<int>>();
list.Add(new List<int> { 0, 1 });

if (list.Contains(new List<int> { 0, 1 }))      // false
  ...

Я пытаюсь проверить, содержит ли список {0,1}, но условие ложно (не знаю почему, может быть, потому что«новое» ключевое слово).Если это не правильно, я хотел бы узнать, как это проверить.

Спасибо!

Ответы [ 4 ]

22 голосов
/ 15 марта 2012

List<T>.Contains вызывает метод Equals() для сравнения объектов.
Поскольку внутреннее List<T> не переопределяет Equals, вы получаете ссылочное равенство.

Это можно исправить, создавпользовательский IEqualityComparer<List<T>>, который сравнивает по значению и передает его Contains().

Вы также можете просто использовать LINQ:

if (list.Any(o => o.SequenceEqual(new[] { 0, 1 }))
2 голосов
/ 15 марта 2012

Вручную :

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

Следующий код показывает, почему ваш код не работает:

var list1 = new List<int> { 0, 1 };
var list2 = new List<int> { 0, 1 };

Console.WriteLine(list1.Equals(list2)); // prints false

List<T> сам по себе не реализует Equals, поэтому он сравнивает с помощьюobject.Equals, который проверяет равенство ссылок, которые не совпадают в вышеприведенном и вашем случае.

Например, вы можете создать собственную реализацию, которая расширяет List<List<int>> и переопределить метод Equals.

2 голосов
/ 15 марта 2012

Вы проверяете, содержит ли list Список № 2, который вы создали, когда добавляли Список № 1. Содержит обычные проверки на предмет наличия объекта с помощью метода Equals, но List не переопределяет этот метод. Это означает, что в этом случае выполняется эталонное сравнение.

Из вашего кода ясно, что они не будут ссылаться на один и тот же список, даже если их значения одинаковы.

1 голос
/ 15 марта 2012

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

List<List<int>> list = new List<List<int>>();
var b = new List<int> { 0, 1 }
list.Add(b);

if (list.Contains(b))...
...