我想知道以下哪种LINQ表达式更好(特别是在性能方面)。
注意:
这一个?
keywords.All(a => SearchKeywords.Contains(a));
或者这个
keywords.Except(SearchKeywords).None();
注意:.None()是我的扩展方法,只返回!.Any()
有没有更好的方法来写这个?
此致
答案 0 :(得分:8)
Except
将大约快几十倍,因为它使用哈希表来查找集合差异¹,从而提供O(n)性能。
对于Contains
中的每个元素,All
/ SearchKeywords
组合必须对keywords
执行天真线性搜索,因此我们正在讨论O(n²)性能(实际上n * m
,但你给出的数字在相同的范围内,并且我可以借口输入指数。
HashSet
,否则更新,it's not even close符合预期,。
¹当然,SearchKeywords
已经一个HashSet<string>
,因为flq非常正确地在评论中指出。
²至少我们在谈论IEnumerable
,它使用LINQ对象标准实现。理论上,IQueryable
可以检测到这一点并以任何方式实现它。
答案 1 :(得分:1)
不确定,但我认为
keywords.Except(SearchKeywords).None();
比前一个更快,因为它可能需要扫描一次才能收集SearchKeywork。
答案 2 :(得分:0)
第一个选项更具可读性,如果SearchWords是本地集合,则与LINQ to SQL兼容
第二个选项与Linq To SQL不兼容。