哪个LINQ表达式更好?

Mo *_*our 4 c# linq performance search

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

笔记:

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

这个?

keywords.All(a => SearchKeywords.Contains(a));
Run Code Online (Sandbox Code Playgroud)

或者这个

keywords.Except(SearchKeywords).None();
Run Code Online (Sandbox Code Playgroud)

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

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

问候

Jon*_*Jon 8

Except 将大约快几千倍,因为它使用散列表来查找集合差异¹,从而提供O(n)性能.

Contains/ All组合就必须做一个天真的线性search²在SearchKeywords对每一个元素keywords,所以我们说的O(N²)性能(实际上n * m,但是你给的数字是在相同的范围,并采取任何借口,我可以键入指数).

更新:正如预期的那样,除非你明确创建一个,否则它甚至都不会关闭HashSet.


¹当然,SearchKeywords 已经是一个HashSet<string>,正如flq非常正确地在评论中指出的那样.

²至少我们在讨论一个IEnumerable使用LINQ对象标准实现的问题.从IQueryable理论上讲,理论上可以检测到这一点并以任何方式实现它.