哪个LINQ表达式更好?

时间:2011-09-22 11:26:04

标签: c# performance linq search

我想知道以下哪种LINQ表达式更好(特别是在性能方面)。

注意:

  • SearchKeywords 的长度通常约为50
  • 关键字的长度通常约为3
  • 此方法被称为约100,000次

这一个?

keywords.All(a => SearchKeywords.Contains(a));

或者这个

keywords.Except(SearchKeywords).None();

注意:.None()是我的扩展方法,只返回!.Any()

有没有更好的方法来写这个?

此致

3 个答案:

答案 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不兼容。