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<T>
传递给List<T>.Contains
方法。您可以将您自己的比较器传递给 LINQ 的 Contains
扩展方法,该方法与 List<T>
非常有效。
【参考方案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 方法