Mo *_*our 4 c# linq performance search
我想知道以下哪个LINQ表达式更好(特别是在性能方面).
笔记:
这个?
keywords.All(a => SearchKeywords.Contains(a));
Run Code Online (Sandbox Code Playgroud)
或者这个
keywords.Except(SearchKeywords).None();
Run Code Online (Sandbox Code Playgroud)
注意:.None()是我的扩展方法,只返回!.Any()
有没有更好的方法来写这个?
问候
Except 将大约快几千倍,因为它使用散列表来查找集合差异¹,从而提供O(n)性能.
该Contains/ All组合就必须做一个天真的线性search²在SearchKeywords对每一个元素keywords,所以我们说的O(N²)性能(实际上n * m,但是你给的数字是在相同的范围,并采取任何借口,我可以键入指数).
更新:正如预期的那样,除非你明确创建一个,否则它甚至都不会关闭HashSet.
¹当然,SearchKeywords 已经是一个HashSet<string>,正如flq非常正确地在评论中指出的那样.
²至少我们在讨论一个IEnumerable使用LINQ对象标准实现的问题.从IQueryable理论上讲,理论上可以检测到这一点并以任何方式实现它.