哪个LINQ表达式更好
本文关键字:更好 表达式 LINQ 哪个 | 更新日期: 2023-09-27 18:09:33
我想知道下面哪个LINQ表达式更好(特别是在性能方面)。
指出:
- 搜索关键词的长度通常在50左右 关键字的长度通常在3左右
- 这个方法大约被调用100,000次
这个吗?
keywords.All(a => SearchKeywords.Contains(a));
或者这个
keywords.Except(SearchKeywords).None();
注意:.None()是我的扩展方法,它只是返回!
有更好的方式来写这个吗?
对
Except
将会大约快无数倍,因为它使用哈希表来查找集差¹,因此将提供O(n)性能。
Contains
/All
组合将不得不对keywords
中的每个元素在SearchKeywords
上进行简单的线性搜索²,所以我们谈论的是O(n²)性能(实际上是n * m
,但您给出的数字在相同的范围内,并采取任何借口我可以键入指数)。
Update:和预期的一样,它甚至不接近,除非你显式地创建一个HashSet
。
¹当然,除非SearchKeywords
已经是一个HashSet<string>
,正如flq在评论中非常正确地指出的那样。
2至少如果我们谈论的是IEnumerable
,它使用了LINQ到对象的标准实现。理论上,IQueryable
可以检测到这一点,并以任何它喜欢的方式实现它。
不确定,但我想
keywords.Except(SearchKeywords).None();
比前一个更快,因为它可能需要扫描一次SearchKeywork的集合。
如果SearchWords是本地集合,则第一个选项更具可读性,并且与LINQ to SQL兼容
第二个选项与Linq To SQL不兼容