加入lambda表达式

LaZ*_*aZe 8 c# lambda

我如何加入像theese这样的两个lambda表达式:

Expression<Func<string, bool>> expr1 = a => a.Length > 100;
Expression<Func<string, bool>> expr2 = b => b.Length < 200;
Run Code Online (Sandbox Code Playgroud)

......变成这样的表达式:

Expression<Func<string, bool>> expr3 = s => s.Length < 100 && s.Length < 200;
Run Code Online (Sandbox Code Playgroud)

也就是说,将它们与AndAlso运算符连接起来.(或者任何其他运营商......)

我实际上成功地进行了一些讨厌的递归替换lambda参数,然后加入Expression.AndAlso方法.但我正在寻找更简单的东西.

例如:(显然不起作用.)

Expression<Func<string, bool>> expr3 = c => expr1(a) && expr2(b);
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 2

如果您正在与普通代表​​打交道,那么您的“类似的东西”就会起作用。但如果你必须使用表达式树,除了递归替换之外,我看不到任何其他解决方案。

在 .NET 4 中,您可以使用 System.Linq.Expressions.ExpressionVisitor 使这种递归替换变得更加容易。对于 .NET 3.5,请查看以下示例:http://msdn.microsoft.com/en-us/library/bb882521.aspx

使用ExpressionVisitor,您只需重写要替换的节点类型的方法,周围的树就会自动重建。

如果您正在处理使用 LINQ 的条件,动态组合条件的一个更简单的解决方案是多次调用Where()。