表示式樹

DaiWK發表於2024-07-10

轉載 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)}");

相關文章