以下请求是否自动“优化”?

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/

10-17 01:14