【问题标题】:How Does List<T>.Contains() Find Matching Items?List<T>.Contains() 如何查找匹配项?
【发布时间】: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; 非常有效。

标签: c# .net list collections contains


【解决方案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,它将使用引用相等性来表示引用类型。

    【讨论】:

      猜你喜欢
      • 2011-12-13
      • 2013-12-19
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      相关资源
      最近更新 更多