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

时间:2013-11-18 15:36:43

标签: c# linq

我知道这听起来可能是重复的问题(例如thisthis),但我想要澄清一下此查询中将发生的次数迭代。

我的假设如下:

假设我收集了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>匹配的项时立即中断循环并返回单个元素或仅在没有项匹配时{ {1}}然后它会遍历整个列表。

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

    <condition>

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

3 个答案:

答案 0 :(得分:15)

Where实际上是递延的 - 即在枚举发生之前它没有任何费用。

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

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

FirstOrDefault返回T

答案 1 :(得分:2)

FirstOrDefault将在/如果找到任何内容时停止检查(即中断)。

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

答案 2 :(得分:2)

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

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