构建采用表达式列表的自定义 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
包含求和的表达式结果
我定义了以下方法:
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
包含求和的表达式结果