C#Linq Where(表达式).FirstorDefault()vs .FirstOrDefault(expression)

时间:2011-11-09 01:15:32

标签: c# linq

我在Linq中很新,并且在使用什么来解决性能问题时陷入困境

var result = ResultLists().Where( c=> c.code == "abc").FirstOrDefault();
vs
var result = ResultLists().FirstOrDefault( c => c.code == "abc");

4 个答案:

答案 0 :(得分:18)

要么没事。

它们都懒洋洋地运行 - 如果源列表有一百万个项目,但第十个项目匹配则两者都只会从源代码中迭代10个项目。

表现应该几乎相同,任何差异都是微不足道的。

答案 1 :(得分:10)

第二个。在所有其他条件相同的情况下,第二种情况下的迭代器可以在找到匹配时立即停止,第一种迭代器必须找到所有匹配项,然后选择第一种匹配项。

答案 2 :(得分:1)

很好的讨论,以上所有答案都是正确的。

我没有进行任何性能测试,但是根据我的经验,与Ore()。FirstOrDefault()相比,FirstOrDefault()有时可以更快地进行优化。

我最近修复了内存溢出/性能问题(“神经网络算法”),并修复了将Where(x-> ...)。FirstOrDefault()更改为简单的FirstOrDefault(x-> ..)。

我没有理会编辑的建议,将Where(x-> ...)。FirstOrDefault()更改为FirstOrDefault(x-> ..)。

所以我相信上述问题的正确答案是

第二种选择是在所有情况下的最佳方法

答案 3 :(得分:0)

Where实际上是一个延迟执行-表示表达式的求值被延迟,直到实际需要其实现值为止。通过避免不必要的执行,大大提高了性能。

Where看起来像这样,并返回一个新的IEnumerable

foreach (var item in enumerable)
{
    if (condition)
    {
        yield return item;
    }
}

FirstOrDefault()返回<T>且没有结果时不抛出任何异常或返回null