Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 哪个LINQ表达式更好?_C#_Performance_Linq_Search - Fatal编程技术网

C# 哪个LINQ表达式更好?

C# 哪个LINQ表达式更好?,c#,performance,linq,search,C#,Performance,Linq,Search,我想知道以下哪种LINQ表达式更好(特别是在性能方面) 注: 搜索关键字的长度通常在50左右 关键字的长度通常在3左右 这个方法大约被调用100000次 这个 keywords.All(a => SearchKeywords.Contains(a)); 还是这个 keywords.Except(SearchKeywords).None(); 注意:.None()是我的扩展方法,它只返回!。任何() 有没有更好的方法写这个 除之外的将快大约一百万倍,因为它使用哈希表来查找设置差异,从

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

注:

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

keywords.All(a => SearchKeywords.Contains(a));
还是这个

keywords.Except(SearchKeywords).None();
注意:.None()是我的扩展方法,它只返回!。任何()

有没有更好的方法写这个


除之外的

将快大约一百万倍,因为它使用哈希表来查找设置差异,从而提供O(n)性能

包含
/
所有
组合必须对
关键字
中的每个元素
搜索关键字
,进行简单的线性搜索,因此我们谈论的是O(n²)性能(实际上
n*m
,但您给出的数字在相同的范围内,请原谅我键入指数)

更新:如预期,除非您显式创建
哈希集


当然,除非
SearchKeywords
已经是
HashSet
,正如flq在评论中非常正确地指出的那样

²至少如果我们讨论的是一个
IEnumerable
,它使用LINQ to objects标准实现。一个
IQueryable
理论上可以检测到这一点,并以它喜欢的任何方式实现它。

不确定,但我认为

keywords.Except(SearchKeywords).None(); 

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

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


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

那么,您的性能度量值是怎么说的?您应该在这里添加AsParallel。我想3个项目的并行是Neutral。无SearchKeywords是一个哈希集,我想除了必须首先构造它之外。@flq:非常正确。我更新了答案和基准以反映这一点。你甚至可以将第一个重写为
关键字.All(SearchWords.Contains)