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

dea*_*ace 9 c# linq

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

我的假设如下:

假设我收集了1000件商品.

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

    foreach (var item in myList)
    {
        if(//<condition>)
        {
            //add it to list/enumerable
        }
        //continue through entire list
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. FirstOrDefault(<condition>)查询中,它开始迭代集合并在获得与之匹配的项<condition>并且返回单个元素时立即中断循环,或者仅在没有项匹配的情况下断开循环,<condition>然后它将遍历整个列表.

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

foreach (var item in myList)
{
    if(//<condition>)
    {
        //return item
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*ite 15

Where 实际上是延期 - 即在枚举发生之前它没有任何成本.

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

foreach (var item in enumerable)
{
    if (condition)
    {
        yield return item;
    }
}
Run Code Online (Sandbox Code Playgroud)

FirstOrDefault回报T.