列表<list <>&gt; .Contains()无法正常工作</list <>

时间:2012-03-15 18:12:19

标签: c# list contains

我有以下代码:

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},但条件是假的(我不知道为什么,可能是因为'new'关键字)。 如果这不是正确的方法,我想知道如何检查。

谢谢!

4 个答案:

答案 0 :(得分:22)

List<T>.Contains调用Equals()方法来比较对象 由于内部List<T>不会覆盖Equals,因此您可以获得引用相等。

您可以通过创建自定义IEqualityComparer<List<T>>来解决此问题,该自定义{%}}按值进行比较并将其传递给Contains()

您也可以使用LINQ:

if (list.Any(o => o.SequenceEqual(new[] { 0, 1 }))

答案 1 :(得分:2)

当您添加列表#1时,您正在检查list是否包含您已创建的列表#2。包含通常使用Equals方法检查是否包含对象,但List不会覆盖此方法。这意味着在这种情况下,它会进行参考比较。

从您的代码可以清楚地看出,即使它们的值相同,这两个也不会引用相同的列表。

答案 2 :(得分:2)

Manual

  

此方法通过使用默认的相等比较器来确定相等性,由对象的T的IEquatable.Equals方法的实现(列表中的值的类型)定义。

以下代码说明了您的代码无效的原因:

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并覆盖{{1}}方法的自己的实现。

答案 3 :(得分:1)

包含检查引用,而不是包含列表中的内容。以下工作

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

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