![](/img/trans.png)
[英]Difference between LINQ FirstOrDefault vs. Where(…).FirstOrDefault?
[英]Logical difference between LINQ Where() and FirstOrDefault()
我知道这听起来可能是重复的问题(比如这个或者这个 )但是我想要清楚一下这个查询中会发生的数字迭代。
我的假设如下:
假设我收集了1000件商品。
在Where()查询中,它遍历每个项目并将其添加到IEnumerable。 即它总是需要O(n)。
foreach (var item in myList) { if(//<condition>) { //add it to list/enumerable } //continue through entire list }
在FirstOrDefault(<condition>)
查询中,它开始迭代集合并在获得与<condition>
匹配的项时立即中断循环并返回单个元素或仅当没有项匹配<condition>
时它将遍历整个清单。
所以复杂性可以从O(1)到O(n)
foreach (var item in myList)
{
if(//<condition>)
{
//return item
break;
}
}
如果这是正确的,那么将FirstORDefault用于单个项目返回总是更好。
Where
居然被推迟-即它不具有任何费用,直到枚举发生。
Where
看起来有点像这一点,并返回一个新IEnumerable<T>
foreach (var item in enumerable)
{
if (condition)
{
yield return item;
}
}
FirstOrDefault
返回T
如果/它发现任何东西, FirstOrDefault
将停止检查(即中断)。
编辑:但是,正如Daniel指出的那样, Where
is deferred,所以你也可以停止迭代自己,它将具有与FirstOrDefault
相同的性能(尽管那时你可能只使用FirstOrDefault)
FirstOrDefault
枚举查询,而Where
只返回一个新的枚举器。 以下陈述给出了相同的结果:
var result = coll.FirstOrDefault(predicate);
var result = coll.Where(predicate).FirstOrDefault();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.