我想知道以下哪个 LINQ 表达式更好(尤其是在性能方面)。

笔记:

  • 的长度 SearchKeywords 通常在 50
  • 左右
  • 关键字的长度 通常在 3
  • 左右
  • 这个方法被调用了大约 100,000 次

  • 这个?
    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/

    10-13 08:20