C# 表达式。和三个条件

C# 表达式。和三个条件,c#,linq-expressions,C#,Linq Expressions,我想创建一个具有三个条件的表达式 但是Linq.Expressions.Expression.And只能接受两个表达式 我想要:Expression1、Expression2和Expression3 Linq.Expressions中是否有直接执行此操作的方法?使用和两次 ie(伪代码) 您必须组合/嵌套它们: Expression.And( Expression.And( ..., ... ), ... ); 在C#中,&是一个二进制运算符,表达式树镜像C# 因此

我想创建一个具有三个条件的表达式

但是Linq.Expressions.Expression.And只能接受两个表达式

我想要:Expression1、Expression2和Expression3


Linq.Expressions中是否有直接执行此操作的方法?

使用
两次

ie(伪代码)


您必须组合/嵌套它们:

Expression.And(
  Expression.And(
    ...,
    ...
  ),
  ...
);
在C#中,
&
是一个二进制运算符,表达式树镜像C#

因此,左关联的C#表达式
a&b&C
,实际上意味着
(a&b)&C
,使用表达式树:

Expresssion.And(Expression.And(a, b), c)
请注意,如果要为
&&
运算符创建表达式树,该运算符也会短路,则应使用

旁注:学习如何构建表达式树的最简单方法是使用C#编译器本身。例如,只需编译以下代码:

Expression<Func<bool>> e = () => a & b & c;
表达式e=()=>a&b&c;

并在反编译器工具(如ILSpy)中检查生成的程序集。只需确保关闭将表达式树解析回代码的任何优化。

提供的答案确实解决了这个问题,但我觉得更好的问题是:如何应用n个条件

可以使用
Aggregate
方法执行此操作,该方法可以将一组条件应用于数据集。例如:

//values to filter
var values = new int[] { 1, 10, 46, 51, 58, 92, 105, 110 }.AsQueryable();
var filters = new Expression<Func<int, bool>>[] {
    i => i % 2 == 0, // integer is even
    i => i > 50,     // integer is greater than 50
    i => i < 100     // integer is less than 100
};
var result = filters.Aggregate(values, (current, expression) => current.Where(expression));
//result is { 58, 92 }
//要筛选的值
var values=newint[]{1,10,46,51,58,92,105,110}.AsQueryable();
var filters=新表达式[]{
i=>i%2==0,//整数为偶数
i=>i>50,//整数大于50
i=>i<100//整数小于100
};
var result=filters.Aggregate(值,(当前,表达式)=>current.Where(表达式));
//结果是{58,92}

这是处理对一组值应用多个过滤器的大多数情况的优雅解决方案。

由于C#中的所有二进制运算符都是左关联的,我会使用
和(和(x,y),z)
而不是
和(x,和(y,z))
和(和(x,y),z)
和(x,和(y,z))的区别是什么
@Azerty123:在这种特殊情况下,两者都会产生相同的结果和副作用,因为二进制和是一种不会短路的关联操作。
//values to filter
var values = new int[] { 1, 10, 46, 51, 58, 92, 105, 110 }.AsQueryable();
var filters = new Expression<Func<int, bool>>[] {
    i => i % 2 == 0, // integer is even
    i => i > 50,     // integer is greater than 50
    i => i < 100     // integer is less than 100
};
var result = filters.Aggregate(values, (current, expression) => current.Where(expression));
//result is { 58, 92 }