C# LINQ Ring:Any()vs Contains()用于大型集合

C# LINQ Ring:Any()vs Contains()用于大型集合,c#,linq,performance,benchmarking,C#,Linq,Performance,Benchmarking,给定一个庞大的对象集合,以下各项之间是否存在性能差异 : : 这取决于收藏。如果您有一个有序的集合,那么Contains可能会进行智能搜索(二进制、哈希、b树等),而对于'Any(),您基本上只能进行枚举,直到找到它为止(假设LINQ to Objects) 还请注意,在您的示例中,Any()使用的是=运算符,它将检查引用相等性,而Contains将使用IEquatable或Equals()方法,该方法可能会被覆盖。Contains()是一个实例方法,其性能在很大程度上取决于集合本身。例如,列表

给定一个庞大的对象集合,以下各项之间是否存在性能差异

:

:


这取决于收藏。如果您有一个有序的集合,那么
Contains
可能会进行智能搜索(二进制、哈希、b树等),而对于'Any(),您基本上只能进行枚举,直到找到它为止(假设LINQ to Objects)

还请注意,在您的示例中,
Any()
使用的是
=
运算符,它将检查引用相等性,而
Contains
将使用
IEquatable
Equals()
方法,该方法可能会被覆盖。

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

Any()
是一个扩展方法,只需遍历集合,将委托应用于每个对象。因此,它的复杂性为O(n)


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

我想这取决于myCollection
的类型,myCollection
指定了如何实现
Contains()
。例如,如果一个已排序的二叉树,它可以更智能地搜索。它还可以考虑元素的散列<另一方面,code>Any()将枚举整个集合,直到找到满足条件的第一个元素。如果对象具有更智能的搜索方法,则没有优化。

Contains()也是一种扩展方法,如果您以正确的方式使用它,它可以快速工作。 例如:

var result=context.Projects.Where(x=>lstBizIds.Contains(x.businessId)).Select(x=>x.projectId.ToList()

这将给出查询

选择Id
来自项目
内部联接(值(1)、(2)、(3)、(4)、(5))作为项目上的数据(项)。UserId=Data.Item

而另一方面,Any()总是遍历O(n)


希望这能奏效……

Contains
也是针对
IEnumerable
的扩展方法(尽管有些集合也有自己的
Contains
实例方法)。正如您所说,
Any
Contains
更灵活,因为您可以向它传递一个自定义谓词,但是
Contains
可能会稍微快一点,因为它不需要对每个元素执行委托调用。Any()对集合中的所有对象执行该操作,还是在第一次匹配时终止?至少在第一次匹配时停止
All()
的操作方式类似。10'000.000整数的集合。赢家是300%的收入。但这是值得考虑的差异,这似乎显示出鲜明的对比两者之间:与任何你可以很容易地比较属性。使用.Contains,您可以只比较对象,并且需要一个额外的IEqualityComparer来比较属性。@msfanboy:没错,但问题是关于性能的,并显示了比较整个对象。所以我认为这与这里无关;您将LINQ和“LINQ到SQL”混为一谈。这里的讨论主要围绕
IEnumerable
,您的答案是关于
IQueryable
。我没有检查它的正确性,但似乎放错了地方。
myCollection.Contains(myElement)
myCollection.Any(currentElement => currentElement == myElement)