Linq myCollection.Where(…).FirstOrDefault()和myCollection.FirstOrDefault(…)之间有性能差异吗
myCollection.Where(…).FirstOrDefault()和myCollection.FirstOrDefault(…)之间有性能差异吗Linq myCollection.Where(…).FirstOrDefault()和myCollection.FirstOrDefault(…)之间有性能差异吗,linq,performance,Linq,Performance,myCollection.Where(…).FirstOrDefault()和myCollection.FirstOrDefault(…)之间有性能差异吗 用您正在使用的谓词填充点。假设我们讨论的是LinqToObject(显然LinqToSql,LinqToWhat有自己的规则),第一个会稍微慢一点,因为必须创建新的迭代器,但您不太可能注意到差异。就比较数量和检查项目数量而言,两者运行所需的时间几乎相同 如果您担心,.Where操作符将列表过滤为n个项目,.FirstOfDefault从过滤后
用您正在使用的谓词填充点。假设我们讨论的是LinqToObject(显然LinqToSql,LinqToWhat有自己的规则),第一个会稍微慢一点,因为必须创建新的迭代器,但您不太可能注意到差异。就比较数量和检查项目数量而言,两者运行所需的时间几乎相同
如果您担心,.Where操作符将列表过滤为n个项目,.FirstOfDefault从过滤后的列表中取出第一个项目,这是不会发生的。这两个序列都将正确短路如果我们假设在这两种情况下您都在使用可枚举静态类提供的扩展方法,那么您将很难测量两者之间的任何差异 更长的形式
myCollection.Where(...).FirstOrDefault()
。。。将(技术上)产生更多的内存活动(创建一个中间迭代器来处理Where()
子句),并涉及更多的处理周期
问题是这些迭代器是懒惰的,Where()
子句不会愉快地遍历整个列表,它只会根据需要检查尽可能多的项以找到要通过的项