繁体   English   中英

LINQ Where()和FirstOrDefault()之间的逻辑区别

[英]Logical difference between LINQ Where() and FirstOrDefault()

我知道这听起来可能是重复的问题(比如这个或者这个 )但是我想要清楚一下这个查询中会发生的数字迭代。

我的假设如下:

假设我收集了1000件商品。

  1. 在Where()查询中,它遍历每个项目并将其添加到IEnumerable。 即它总是需要O(n)。

     foreach (var item in myList) { if(//<condition>) { //add it to list/enumerable } //continue through entire list } 
  2. FirstOrDefault(<condition>)查询中,它开始迭代集合并在获得与<condition>匹配的项时立即中断循环并返回单个元素或仅当没有项匹配<condition>时它将遍历整个清单。

所以复杂性可以从O(1)到O(n)

foreach (var item in myList)
{
    if(//<condition>)
    {
        //return item
        break;
    }
}

如果这是正确的,那么将FirstORDefault用于单个项目返回总是更好。

Where居然被推迟-即它不具有任何费用,直到枚举发生。

Where看起来有点像这一点,并返回一个新IEnumerable<T>

foreach (var item in enumerable)
{
    if (condition)
    {
        yield return item;
    }
}

FirstOrDefault返回T

如果/它发现任何东西, FirstOrDefault将停止检查(即中断)。

编辑:但是,正如Daniel指出的那样, Where is deferred,所以你也可以停止迭代自己,它将具有与FirstOrDefault相同的性能(尽管那时你可能只使用FirstOrDefault)

FirstOrDefault枚举查询,而Where只返回一个新的枚举器。 以下陈述给出了相同的结果:

var result = coll.FirstOrDefault(predicate);
var result = coll.Where(predicate).FirstOrDefault();

暂无
暂无

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

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