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方法,则没有优化。