如何结合两个lambdas
可能重复:
在c#中组合两个lamba表达式
我有两个以下表达式:
Expression<Func> expr1 = s => s.Length == 5; Expression<Func> expr2 = s => s == "someString";
现在我需要将它们与OR结合起来。 像这样的东西:
Expression.Or(expr1, expr2)
有没有办法让这类似于上面的代码方式:
expr1 || expr2
我理解在这个例子中我可以把它组合起来:
Expression<Func> expr = s => s.Length == 5 || s == "someString"
但我不能在我的实际代码中这样做,因为我将expr1和expr2作为方法的参数。
要完成Eric的答案,请使用.NET 4中引入的新ExpressionVisitor
而不是自定义重写器:
internal class ParameterReplacer : ExpressionVisitor { private readonly ParameterExpression _parameter; protected override Expression VisitParameter(ParameterExpression node) { return base.VisitParameter(_parameter); } internal ParameterReplacer(ParameterExpression parameter) { _parameter = parameter; } } class Program { static void Main(string[] args) { Expression> expr1 = s => s.Length == 5; Expression> expr2 = s => s == "someString"; var paramExpr = Expression.Parameter(typeof(string)); var exprBody = Expression.Or(expr1.Body, expr2.Body); exprBody = (BinaryExpression) new ParameterReplacer(paramExpr).Visit(exprBody); var finalExpr = Expression.Lambda>(exprBody, paramExpr); } }
问题是每个lambda中的“s”参数具有相同的名称和相同的类型,但它们是不同的参数。 参数具有引用标识 ,而不是值标识 。 简单地将现有表达式树的两个主体组合成第三个表达式树有效地:
s => s1.Length == 5 || s2 == "somestring"
这没有任何意义。 你想要做的是写一个访问者,用一个新参数搜索和替换参数s,然后你将把它作为新lambda表达式的参数。
有关详细信息,请参阅此相关问题:
在c#中组合两个lambda表达式
上述就是C#学习教程:如何结合两个lambdas分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/960934.html