[英]C# Linq Where(expression).FirstorDefault() vs .FirstOrDefault(expression)
这两个 Linq 查询有什么区别:
var result = ResultLists().Where( c=> c.code == "abc").FirstOrDefault();
// vs.
var result = ResultLists().FirstOrDefault( c => c.code == "abc");
FirstOrDefault
比Where()
加上普通FirstOrDefault()
提供任何理论或实践性能优势?哪一个都好。
它们都懒惰地运行——如果源列表有一百万个项目,但第十个项目匹配,那么两者都只会从源中迭代 10 个项目。
性能应该几乎相同,任何差异都将完全无关紧要。
第二个。 在所有其他条件相同的情况下,第二种情况下的迭代器可以在找到匹配项后立即停止,第一个必须找到所有匹配项,然后选择其中的第一个。
很好的讨论,以上所有答案都是正确的。
我没有进行任何性能测试,但根据我的经验,FirstOrDefault() 有时比 Where().FirstOrDefault() 更快并且优化。
我最近修复了 memory 溢出/性能问题(“神经网络算法”)并修复将 Where(x->...).FirstOrDefault() 更改为简单的 FirstOrDefault(x->..)。
我忽略了编辑将 Where(x->...).FirstOrDefault() 更改为简单的 FirstOrDefault(x->..) 的建议。
所以我相信上述问题的正确答案是
第二种选择是所有情况下的最佳方法
Where
实际上是延迟执行 - 这意味着,表达式的评估被延迟,直到实际需要其实现的值。 它通过避免不必要的执行来极大地提高性能。
Where
看起来有点像这样,并返回一个新的 IEnumerable
foreach (var item in enumerable)
{
if (condition)
{
yield return item;
}
}
FirstOrDefault()
返回<T>
并且不抛出任何异常或在没有结果时返回 null
在比较语法时,在确定它们的用例(或者它们是否相同)时,三件事很重要:
如果您重视性能,因为您的集合很大/等等,请使用 Where().First。 如果您重视可读性,因为您确定您的集合不会很大,请使用 First()。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.