LINQ 环: 对于大型集合,Any() vs Contains()

给定一个庞大的对象集合,下面两个对象之间是否存在性能差异?

集合。包含 :

myCollection.Contains(myElement)

任何 :

myCollection.Any(currentElement => currentElement == myElement)
80105 次浏览

这取决于收藏品。如果您有一个有序的集合,那么 Contains可能会进行智能搜索(二进制、散列、 b-tree 等) ,而使用‘ Any () ,您基本上只能进行枚举,直到找到它(假设是 LINQ-to-Objects)。

还要注意,在您的示例中,Any()使用的是 ==操作符,该操作符将检查引用相等性,而 Contains将使用 IEquatable<T>Equals()方法,该方法可能会被重写。

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

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

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

I suppose that would depend on the type of myCollection is which dictates how Contains() is implemented. If a sorted binary tree for example, it could search smarter. Also it may take the element's hash into account. Any() on the other hand will enumerate through the collection until the first element that satisfies the condition is found. There are no optimizations for if the object had a smarter search method.

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

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

这将给出查询

选择 ID 来自贫民区 内连接(VALUES (1) ,(2) ,(3) ,(4) ,(5)) AS Data (Item) ON Projects. UserId = Data. Item

内连接(VALUES (1) ,(2) ,(3) ,(4) ,(5)) AS Data (Item) ON Projects. UserId = Data. Item

内连接(VALUES (1) ,(2) ,(3) ,(4) ,(5)) AS Data (Item) ON Projects. UserId = Data

而 Any ()总是遍历 O (n)。

希望这个能管用。