哪个LINQ表达式更好?

4
我在想以下哪个LINQ表达式更好(尤其是在性能方面)。
注:
  • SearchKeywords的长度通常为50左右
  • keywords的长度通常为3左右
  • 该方法会被调用约100,000次
这个?
keywords.All(a => SearchKeywords.Contains(a));

或者这一个

keywords.Except(SearchKeywords).None();

注意:.None() 是我的扩展方法,它只是返回 !.Any()。
有更好的写法吗?
敬礼

1
你的性能测量结果如何? - AakashM
你应该添加 AsParallel。 - Nahum
我认为对于3个项目的并行是中性的。 - Mo Valipour
3个回答

8
Except将会快上数十倍,因为它使用哈希表来查找集合的差异¹,因此可以实现O(n)的性能。而Contains/All组合必须对SearchKeywords中的每个元素进行朴素的线性搜索²,因此我们在谈论O(n²)的性能(实际上是n * m,但您提供的数字在同一范围内,我可以用任何借口来输入指数)。 更新:如预期所料,除非您明确创建一个HashSet,否则性能相差甚远
¹当然,如果SearchKeywords已经是HashSet<string>,就不需要这么做了,正如flq在评论中非常正确地指出的那样。
²至少,如果我们谈论的是IEnumerable,它使用LINQ to objects标准实现。一个IQueryable理论上可以检测到这一点,并以任何它喜欢的方式来实现它。

1
除非SearchKeywords是一个HashSet,否则我认为Except首先必须构造它。 - flq
@flq:非常正确。我已经更新了答案和基准测试以反映这一点。 - Jon

1

不确定,但我认为

keywords.Except(SearchKeywords).None(); 

这个比之前的快,因为它可能只需要扫描一次来收集搜索关键字的集合。


0

第一种选择更易读,并且如果SearchWords是本地集合,则与LINQ to SQL兼容。

第二种选择不兼容Linq To SQL。


你甚至可以将第一个重写为 Keywords.All(SearchWords.Contains) - Bob Vale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接