我有以下代码:
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'关键字)。 如果这不是正确的方法,我想知道如何检查。
谢谢!
答案 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)
此方法通过使用默认的相等比较器来确定相等性,由对象的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))...