LINQ Ring:Any()vs Contains()以获取大量集合

问题描述 投票:96回答:4

考虑到大量的对象,以下各项之间是否存在性能差异?

Collection.Contains

myCollection.Contains(myElement)

Enumerable.Any

myCollection.Any(currentElement => currentElement == myElement)
c# linq performance benchmarking
4个回答
133
投票

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

Any()是扩展方法,将简单地遍历该集合,将委托应用于每个对象。因此,它的复杂度为O(n)。

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


12
投票

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

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


4
投票

我想这取决于myCollection的类型,它决定了Contains()的实现方式。例如,如果使用排序的二叉树,则搜索会更智能。同样,它也可以考虑元素的哈希值。另一方面,Any()将对集合进行枚举,直到找到满足条件的第一个元素。没有优化对象是否具有更智能的搜索方法。


0
投票

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

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

这将给出查询

SELECT Id FROM Projects INNER JOIN (VALUES (1), (2), (3), (4), (5)) AS Data(Item) ON Projects.UserId = Data.Item

另一方面,Any()总是迭代O(n)。

希望这会起作用。...]

© www.soinside.com 2019 - 2024. All rights reserved.