myCollection.Where(...)之间是否有任何性能差异.FirstOrDefault()和myCollection.FirstOrDefault(...)

时间:2009-07-13 02:02:05

标签: linq performance

myCollection.Where(...)之间是否存在性能差异.FirstOrDefault()和myCollection.FirstOrDefault(...)

使用您正在使用的谓词填充点。

2 个答案:

答案 0 :(得分:6)

假设我们正在谈论LinqToObjects(显然LinqToSql,LinqToWhatever有自己的规则),第一个将会如此慢一点,因为必须创建一个新的迭代器,但是你不可能注意到差异。在比较次数和检查项目数量方面,两者运行的时间几乎完全相同。

如果你担心,会发生什么是.Where运算符将列表过滤到 n 项目,而.firstOfDefault采取第一个过滤清单。两个序列都会正确短路

答案 1 :(得分:0)

如果我们假设在两种情况下你都使用Enumerable静态类提供的扩展方法,那么你将很难衡量两者之间的差异。

更长的形式...

myCollection.Where(...).FirstOrDefault()

...将(技术上)产生更多的内存活动(创建一个中间迭代器来处理Where()子句)并涉及更多的处理周期。

问题是这些迭代器是 lazy - Where()子句不会快速通过评估谓词的整个列表,它只会检查必要的项目以查找一个要通过。