繁体   English   中英

C# Linq Where(expression).FirstorDefault() vs.FirstOrDefault(expression)

[英]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 的谓词形式FirstOrDefaultWhere()加上普通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 提供了更好的性能。 虽然我不知道确切原因,但我的假设是 Where() 使用延迟执行,而 First() 没有。 可以在这里看到显示差异的基准,这是巨大的。
  • 它们是否同样具有可读性? No;.First() 更简洁地传达了含义。 然而 Where() 不是不可读的,它只是没有那么好。

如果您重视性能,因为您的集合很大/等等,请使用 Where().First。 如果您重视可读性,因为您确定您的集合不会很大,请使用 First()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM