有什么区别

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


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

?

据我了解,在这两种情况下,Linq 都会运行到第一次出现符合条件的情况。

最佳答案

如果我们谈论的是 Linq to Objects,那么有一个显着的区别。第二个声明

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

将在内部创建 WhereEnumerableIterator,然后它将开始枚举并取第一项:
// 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();
}

但是第一个语句只会从匹配谓词的源中获取第一项,而无需创建额外的枚举器:
// 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();
}

因此,第一个在性能方面更好:
FirstOrDefault(someField => someField.Name.Equals(settings.Text))

关于c# - LINQ FirstOrDefault 与 Where(...).FirstOrDefault 之间的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20394023/

10-15 03:06