LINQ环:任何()与包含()巨大的集合

鉴于对象的巨大集合,以下是否有性能差异?

Collection.Contains :

myCollection.Contains(myElement) 

Enumerable.Any :

 myCollection.Any(currentElement => currentElement == myElement) 

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

Any()是一个扩展方法,将简单地通过集合,在每个对象上应用委托。 因此它具有O(n)的复杂性。

任何()更灵活,但你可以传递一个委托。 Contains()只能接受一个对象。

这取决于收集。 如果你有一个有序的集合,那么Contains可能会做一个智能search(二进制,散列,B树等),而任何()你基本上坚持枚举,直到你find它(假设LINQ到对象)

另外请注意,在你的例子中,Any()使用“==”运算符来检查引用是否相等,而Contains将使用IEquitable或Equals()方法来重写。

我想这将取决于myCollection的types,它决定了Contains()是如何实现的。 如果一个sorting的二叉树,例如,它可以search更聪明。 也可能需要考虑元素的散列。 Any()另一方面将通过集合枚举,直到满足条件的第一个元素被发现。 如果对象具有更智能的search方法,则没有优化。