我想知道以下哪个 LINQ 表达式更好(尤其是在性能方面)。
笔记:
这个?
keywords.All(a => SearchKeywords.Contains(a));
或者这个
keywords.Except(SearchKeywords).None();
注意:.None() 是我的扩展方法,它只返回 !.Any()
有没有更好的方法来写这个?
问候
最佳答案
Except
将快大约 10 亿倍,因为它使用哈希表来查找集差¹,因此将提供 O(n) 性能。Contains
/All
组合必须对 SearchKeywords
中的每个元素进行朴素的线性搜索²,所以我们谈论的是 O(n²) 性能(实际上是 keywords
,但您提供的数字在同一范围内,我可以找任何借口)输入指数)。
更新: 符合预期,it's not even close 除非您明确创建 n * m
。
¹当然,除非 HashSet
已经是 SearchKeywords
,正如 flq 在评论中非常正确地指出的那样。
²至少如果我们谈论的是 HashSet<string>
,它使用 LINQ to objects 标准实现。 IEnumerable
理论上可以检测到这一点并以任何它喜欢的方式实现它。
关于c# - 哪个 LINQ 表达式更好?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7513981/