以下请求是否自动“优化”?
var result = initial
.Where(Predicate1)
.Where(Predicate2)
.Where(Predicate3);
这相当于
var result = initial
.Where(e => Predicate1(e) && Predicate2(e) && Predicate3(e));
这两个语句中哪一个是最优化的?还是一样?
最佳答案
尽管编译后的代码没有组合谓词,但是执行实际上是结合在一起的。当传递一个List时,Linq的Where方法将返回WhereListIterator。 WhereListIterator拥有自己的Where方法实现,该实现返回结合了谓词的新WhereListIterator。看起来像这样:return new Enumerable.WhereListIterator<T>(this.source, Enumerable.CombinePredicates<T>(this.predicate, predicate)
其中this.source是列表,this.predicate是第一个Where的谓词,而谓词来自第二个Where。
CombinePredicates返回一个包含以下代码的委托(delegate):
if (predicate1(source)) return predicate2(source);
return false;
因此,链接的Where子句应该以类似以下内容的形式结束:
if (predicate1(source)) {
if (predicate2(source) {
return predicate3(source) {
}
return false;
}
return false;
对于较小的列表,使用&&将谓词组合到单个Where中可能会更有效,但是随着列表大小的增加,两个选项的运行时间可能会变得相似。您必须对其进行概要分析以量化差异是什么。我怀疑它的大小不足以解决很多问题。
关于c# - 最优化使用多个Where语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18080998/