哪个LINQ表达式更好

本文关键字:更好 表达式 LINQ 哪个 | 更新日期: 2023-09-27 18:09:33

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

指出:

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

这个吗?

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

或者这个

keywords.Except(SearchKeywords).None();

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

有更好的方式来写这个吗?

哪个LINQ表达式更好

Except将会大约快无数倍,因为它使用哈希表来查找集差¹,因此将提供O(n)性能。

Contains/All组合将不得不对keywords中的每个元素在SearchKeywords上进行简单的线性搜索²,所以我们谈论的是O(n²)性能(实际上是n * m,但您给出的数字在相同的范围内,并采取任何借口我可以键入指数)。

Update:和预期的一样,它甚至不接近,除非你显式地创建一个HashSet


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

2至少如果我们谈论的是IEnumerable,它使用了LINQ到对象的标准实现。理论上,IQueryable可以检测到这一点,并以任何它喜欢的方式实现它。

不确定,但我想

keywords.Except(SearchKeywords).None(); 

比前一个更快,因为它可能需要扫描一次SearchKeywork的集合。

如果SearchWords是本地集合,则第一个选项更具可读性,并且与LINQ to SQL兼容

第二个选项与Linq To SQL不兼容