轉載 C#-表示式樹 - 一隻獨行的猿 - 部落格園 (cnblogs.com)
int[] ints1 = new int[] { 1,23,434,631,3,56,86,83 }; Console.WriteLine($"篩選前資料:{string.Join(',',ints1)}"); Expression<Func<int, bool>>[] expressions = new Expression<Func<int, bool>>[] { (b) => b > 3, (a) =>a > 5, (c) => c < 30 }; Expression<Func<int, bool>> expressionAnd = (i)=>true; expressions.ToList().ForEach(expr => { Console.WriteLine($"表示式:{expr.Body}"); //用於將引數名進行替換,二者引數不一樣 ParameterExpression newParameter = Expression.Parameter(typeof(int), "c"); NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter); //需要先將引數替換為一致的,可能引數名不一樣 var left = visitor.Replace(expressionAnd.Body);//左側的表示式 var right = visitor.Replace(expr.Body);//右側的表示式 var body = Expression.AndAlso(left, right);//合併表示式 And--& AndAlso--&&(短路) //var body = Expression.OrElse(left, right);//合併表示式 And--| AndAlso--|| expressionAnd = Expression.Lambda<Func<int, bool>>(body, newParameter); }); Console.WriteLine($"合併後表示式:{expressionAnd.Body}"); int[] ints2 = ints1.Where(i=>expressionAnd.Compile().Invoke(i)).ToArray(); Console.WriteLine($"篩選後資料:{string.Join(',', ints2)}");