LINQ Ring:任何()vs Contains()用于巨大的集合

SDR*_*yes 97 c# linq performance benchmarking

鉴于对象的大量集合,以下是否存在性能差异?

Collection.Contains:

myCollection.Contains(myElement)
Run Code Online (Sandbox Code Playgroud)

Enumerable.Any:

myCollection.Any(currentElement => currentElement == myElement)
Run Code Online (Sandbox Code Playgroud)

Eti*_*tel 133

Contains()是一个实例方法,其性能在很大程度上取决于集合本身.例如,List上的Contains()是O(n),而HashSet上的Contains()是O(1).

Any()是一个扩展方法,只需遍历集合,在每个对象上应用委托.因此它具有O(n)的复杂性.

Any()更灵活,因为您可以传递委托.Contains()只能接受一个对象.

  • `Contains`也是对`IEnumerable <T>`的扩展方法(虽然有些集合也有自己的`Contains`实例方法).正如你所说,'Any`比`Contains`更灵活,因为你可以传递一个自定义谓词,但`Contains`*可能会稍快一些,因为它不需要为每个元素执行委托调用. (26认同)
  • **Any()** 是对集合中的所有对象执行操作还是在第一个匹配项时终止? (2认同)
  • 至少[根据来源](https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,8788153112b7ffd0),它在第一场比赛中停止。`All()` 的操作类似。 (2认同)

tst*_*ter 12

这取决于收集.如果你有一个有序的集合,那么Contains可以做一个智能搜索(二进制,哈希,b树等),而使用Any()你基本上坚持枚举,直到你找到它(假设LINQ为对象)

另请注意,在您的示例中,Any()使用"=="运算符来检查引用相等性,而Contains将使用IEquitable或可能被覆盖的Equals()方法.

  • 使用.Any,您可以轻松比较属性.使用.Contains,您只需比较对象,您需要额外的IEqualityComparer来比较属性. (4认同)