LINQ FirstOrDefault与Where(...).FirstOrDefault之间的区别? [英] Difference between LINQ FirstOrDefault vs. Where(...).FirstOrDefault?

查看:116
本文介绍了LINQ FirstOrDefault与Where(...).FirstOrDefault之间的区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

FirstOrDefault(someField => someField.Name.Equals(settings.Text))

Where(someField => someField.Name.Equals(settings.Text)).FirstOrDefault() 

?

据我所知,Linq会一直运行到适合该条件的第一次出现.

As far as I understand in both cases Linq will run till the first occurence that suits the condition.

推荐答案

如果我们谈论的是Linq to Objects,则有一个显着的区别.第二句话

If we are talking about Linq to Objects, then there is one notable difference. Second statement

Where(someField => someField.Name.Equals(settings.Text)).FirstOrDefault() 

将在内部创建 WhereEnumerableIterator ,然后它将开始枚举并采用第一项:

Will create WhereEnumerableIterator internally, and then it will start enumeration and take first item:

// argument checks and collection optimizations removed
public static IEnumerable<TSource> Where<TSource>(
     this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
     // it enumerates source and returns items which match predicate
     return new WhereEnumerableIterator<TSource>(source, predicate);
}

public static TSource First<TSource>(this IEnumerable<TSource> source)
{
    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
    {
        if (enumerator.MoveNext())        
            return enumerator.Current;        
    }

    throw Error.NoElements();
}

但是第一条语句只会从源中获取与谓词匹配的第一项,而无需创建其他枚举器:

But first statement will just take first item from source which matches predicate without creating additional enumerator:

// argument checks removed
public static TSource First<TSource>(
    this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{    
    foreach (TSource local in source)
    {
        if (predicate(local))        
            return local;        
    }

    throw Error.NoMatch();
}

因此,第一个在性能方面更好:

So, first one is better in terms of performance:

FirstOrDefault(someField => someField.Name.Equals(settings.Text))

这篇关于LINQ FirstOrDefault与Where(...).FirstOrDefault之间的区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆