构建采用表达式列表的自定义 SUM 函数的更好方法

A better way to build a custom SUM function which takes a list of Expressions

我定义了以下方法:

public static Expression Sum(IList<Expression> expressions)
{
    Expression result = expressions[0];
    foreach (var expression in expressions.Skip(1))
    {
        result = Expression.Add(result, expression);
    }

    return result;
}

可用作:

var number1 = Expression.Constant(42.0);
var number2 = Expression.Constant(10.0);

var resultExpression = Sum(new { number1, number2 });
var value = Expression.Lambda(resultExpression).Compile().DynamicInvoke();

但是当添加大量的表达式时,我觉得性能不太好。

所以我想知道是否可以创建一个使用 Enumerable.Sum 或 Queryable.Sum 来完成工作的方法。

我认为您正在重新定义聚合方法,该方法使用表达式列表中的先前 Add 表达式和当前表达式。将您的代码更改为:

return expressions.Aggregate((previousExpr, currentExpr) => Expression.Add(previousExpr, currentExpr));

我不确定这是否更快,但更干净。 previousExpr 包含求和的表达式结果