列表<列表<>>.包含 () 不起作用

本文关键字:列表 不起作用 包含 | 更新日期: 2023-09-27 18:28:00

我有以下代码:

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

谢谢!

列表<列表<>>.包含 () 不起作用

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

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

您也可以只使用 LINQ:

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

您正在检查list是否包含您在添加列表 #1 时所做的列表 #2。包含通常使用 Equals 方法检查对象是否包含,但 List 不会重写此方法。这意味着在这种情况下,它会进行引用比较。

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

手册:

此方法通过使用默认相等比较器来确定

相等性,该比较器由对象的 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 方法。

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

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