考虑到大量的对象,以下各项之间是否存在性能差异?
myCollection.Contains(myElement)
myCollection.Any(currentElement => currentElement == myElement)
Contains()是一个实例方法,其性能在很大程度上取决于集合本身。例如,列表上的Contains()为O(n),而HashSet上的Contains()为O(1)。
Any()是扩展方法,将简单地遍历该集合,将委托应用于每个对象。因此,它的复杂度为O(n)。
Any()更为灵活,因为您可以传递委托。 Contains()只能接受一个对象。
取决于收藏。如果您有一个有序的集合,那么Contains可能会进行智能搜索(二进制,哈希,b树等),而使用Any()时,您基本上会坚持枚举,直到找到它为止(假定LINQ to Objects)
还请注意,在您的示例中,Any()使用的是“ ==”运算符,该运算符将检查引用相等性,而Contains将使用IEquitable或Equals()方法,该方法可能会被覆盖。
我想这取决于myCollection
的类型,它决定了Contains()
的实现方式。例如,如果使用排序的二叉树,则搜索会更智能。同样,它也可以考虑元素的哈希值。另一方面,Any()
将对集合进行枚举,直到找到满足条件的第一个元素。没有优化对象是否具有更智能的搜索方法。
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)。
希望这会起作用。...]