C#Linq Where(表达式).FirstorDefault()vs .FirstOrDefault(expression)

SOF*_*eme 44 c# linq

我在Linq非常新,并且在使用什么来表现性能方面处于两难境地

var result = ResultLists().Where( c=> c.code == "abc").FirstOrDefault();
// vs.
var result = ResultLists().FirstOrDefault( c => c.code == "abc");
Run Code Online (Sandbox Code Playgroud)

Eni*_*ity 25

要么没事.

它们都懒惰地运行 - 如果源列表有一百万个项目,但第十个项目匹配则两者都只迭代来自源的10个项目.

性能应该几乎相同,任何差异都是微不足道的.

  • @NewAmbition - 你的谈话时间不到百分之一.那不是很多时间.当我比较两种方法时,我得到的差异是超过150,000个项目的时间为1ms(每个项目不是1ms,所有150,000个都是1ms).因此,基于您的500 x 1,000项目查询,每天约0.003毫秒.这并不重要. (6认同)
  • 我认为这个词是斜体,而不是粗体:| 你是对的,虽然我使用的是一个臃肿的例子.我不打算听起来有点douchey,只是有时微小的性能命中可以加起来:) (6认同)
  • 没有区别**是微不足道的** - 每天500个用户调用的一千个项目的1毫秒加起来很多时间. (3认同)

Dav*_*e C 11

第二个.在所有其他条件相同的情况下,第二种情况下的迭代器可以在找到匹配时立即停止,其中第一种必须找到所有匹配,然后选择第一种匹配.

  • 我开始得到"等待操作超时".在大型数据集上使用`Where(query).FirstOrDefault()`.当我把它改成'FirstOrDefault(查询)`时我就不再看到了它; 所以也许这个答案有所帮助.无论如何,代码读起来稍微好一些. (13认同)
  • 不正确 - LINQ的链接行为意味着它会懒惰地迭代.对于这两种方法,如果第一项是匹配,它们将不再进一步. (7认同)
  • 我相信`Where`会产生一个"投影"或"懒惰的可枚举序列"(虽然可能会有更多的开销,但它不需要运行来自`ResultList`的任何更多元素,请参阅结尾注释),但我选择后者在大多数情况下....在LINQ2SQL或类似的情况下,我不知道查询生成器会做什么. (6认同)
  • @Enigmativity:对于所有Linq提供商来说都不是这样.虽然Linq to Objects确实如此,但基于SQL基础的提供程序必须在返回第一个对象之前返回(或至少处理)整个集合.最重要的是,无论某些提供商提供什么基础优化,因为在所有情况下都不能依赖它是真的,最好是在概念上始终给出正确的行为,所有其他条件相同. (5认同)
  • @DaveC - 你肯定会找到最基本的提供者来确定`FirstOrDefault`应该返回'TOP 1`项目,当然? (4认同)

Iht*_*has 6

很好的讨论,以上所有答案都是正确的。

我没有运行任何性能测试,而根据我的经验,FirstOrDefault() 有时比Where().FirstOrDefault() 更快并且优化。

我最近修复了内存溢出/性能问题(“神经网络算法”),修复方法是将Where(x->...).FirstOrDefault()更改为简单的FirstOrDefault(x->..)。

我忽略了编辑将Where(x->...).FirstOrDefault()更改为简单的FirstOrDefault(x->..)的建议。

所以我相信上述问题的正确答案是

第二种选择是所有情况下的最佳方法