List<T>.Contains() 如何查找匹配项?

Posted

技术标签:

【中文标题】List<T>.Contains() 如何查找匹配项?【英文标题】:How Does List<T>.Contains() Find Matching Items? 【发布时间】:2012-03-05 02:14:54 【问题描述】:

我有一个汽车对象列表

 List<Car> cars = GetMyListOfCars();

我想看看列表中是否有汽车

if (cars.Contains(myCar))


Contains 使用什么来确定 myCar 是否在列表中。它是否在我的汽车对象上执行“ToString()”。是否使用 Equals() 方法,gethashcode()?

我知道我可以传入我自己的 IEqualityComparer 来强制我自己的实现,但只是想了解它默认的作用。

【问题讨论】:

ToString 在没有被覆盖时返回类型的名称,因此它不是比较项目的好方法:) 顺便说一句,您不能将自己的IEqualityComparer&lt;T&gt; 传递给List&lt;T&gt;.Contains 方法。您可以将您自己的比较器传递给 LINQ 的 Contains 扩展方法,该方法与 List&lt;T&gt; 非常有效。 【参考方案1】:

直接来自MSDN - List<T>.Contains:

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

此方法执行线性搜索;因此,这种方法是一种 O(n) 运算,其中 n 为 Count。

所以最终取决于T如何实现IEquatable.Equals()。对于大多数对象,这将是一个参考比较,除非被覆盖。内存中的相同位置是相同的对象。

【讨论】:

一个例外情况是,如果您搜索null,在这种情况下Contains 只是直接执行item == null 测试而不是使用比较器。【参考方案2】:

它使用 Equals()

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

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

【讨论】:

【参考方案3】:

Contains 将尽快返回 true - 即一旦找到符合条件的第一个项目。

所有项被迭代后,将返回false

关于如何这样做 - 如果您不覆盖 Equals,它将使用引用相等性来表示引用类型。

【讨论】:

以上是关于List<T>.Contains() 如何查找匹配项?的主要内容,如果未能解决你的问题,请参考以下文章

android mono:使用 List<T> 而不是 ArrayAdapter 来使用 Contains 方法

在unity list.exist和contains的区别

List<object>.Contains 表达式树

Java List.contains(ArrayList<String> 字段值等于 x)

LINQ List.Contains() 重载以接受列名

Sequence contains no elements