![](/img/trans.png)
[英]Logical difference between LINQ Where() and FirstOrDefault()
[英]Difference between LINQ FirstOrDefault vs. Where(…).FirstOrDefault?
有什么区别
FirstOrDefault(someField => someField.Name.Equals(settings.Text))
和
Where(someField => someField.Name.Equals(settings.Text)).FirstOrDefault()
?
据我所知,在这两种情况下,Linq将一直运行到第一次出现这种情况。
他们两个陈述的结果是一样的。 您可以将第一个视为第二个的较短版本。
FirstOrDefault
方法有一个重载接受第二个参数,一个Func<TSource, bool>
,它与你在Where
语句中定义的谓词相同。
如果我们谈论Linq to Objects,那么有一个显着的区别。 第二个声明
Where(someField => someField.Name.Equals(settings.Text)).FirstOrDefault()
将WhereEnumerableIterator
内部创建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))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.