我知道这听起来可能是重复的问题(例如this或this),但我想要澄清一下此查询中将发生的次数迭代。
我的假设如下:
假设我收集了1000件物品。
在Where()查询中,它遍历每个项目并将其添加到IEnumerable。即它总是需要O(n)。
foreach (var item in myList)
{
if(//<condition>)
{
//add it to list/enumerable
}
//continue through entire list
}
在FirstOrDefault(<condition>)
查询中,它开始迭代集合并在获得与<condition>
匹配的项时立即中断循环并返回单个元素或仅在没有项匹配时{ {1}}然后它会遍历整个列表。
所以复杂性可以从O(1)到O(n)
<condition>
如果这是正确的,那么将FirstORDefault用于单个项目返回总是更好。?
答案 0 :(得分:15)
Where
实际上是递延的 - 即在枚举发生之前它没有任何费用。
Where
看起来有点像这样,并返回一个新的IEnumerable<T>
。
foreach (var item in enumerable)
{
if (condition)
{
yield return item;
}
}
FirstOrDefault
返回T
。
答案 1 :(得分:2)
FirstOrDefault
将在/如果找到任何内容时停止检查(即中断)。
编辑:
但是,正如Daniel指出的那样,Where
被推迟,所以你也可以停止迭代自己,它将具有与FirstOrDefault
相同的性能(尽管那时你也可以使用FirstOrDefault)
< / p>
答案 2 :(得分:2)
FirstOrDefault
枚举查询,而Where
只返回一个新的枚举器。以下陈述给出了相同的结果:
var result = coll.FirstOrDefault(predicate);
var result = coll.Where(predicate).FirstOrDefault();