zoukankan      html  css  js  c++  java
  • 动态创建 Lambda 表达式

    首先我们看一个简单 Lambda 表达式的构成。

    i => i > 5


    在这个表达式中,"i" 被称为 Parameter,"i > 5" 是 Body。我们可以对 Body 进行更进一步的分解,那么 "i > 5" 分别包含参数(i)、操作符(>)以及一个常数(5)。所有这些通过特定顺序的组合,从而构建一个完整的 Lambda 表达式。

    我们通过一些例子,来学习如何动态构建这些表达式。

    例子1

                var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
                //list = list.Where(i => i > 5);  //要实现的表达式
    
                // 创建参数 i
                var parameter = Expression.Parameter(typeof(int), "i");
    
                // 创建常量 5
                var constant = Expression.Constant(5);
                // 创建比较表达式 i > 5
                var body = Expression.GreaterThan(parameter, constant);
    
                // 获取Lambda表达式
                var lambda = Expression.Lambda<Func<int, bool>>(body, parameter);
    
                // 通过 Compile 方法获取 Delegate
                var _r = list.Where(lambda.Compile());
    View Code

    例子2

                var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
                //list = list.Where(i => i > 5 && i <= 7); // 要实现的表达式
    
                // 创建参数 i
                var parameter = Expression.Parameter(typeof(int), "i");
    
                // 创建常量 5
                var constant1 = Expression.Constant(5);
                // 创建比较表达式 i > 5
                var left = Expression.GreaterThan(parameter, constant1);
    
                // 创建常量 7
                var constant2 = Expression.Constant(7);
                // 创建比较表达式 i <= 7
                var right = Expression.LessThanOrEqual(parameter, constant2);
    
                // 创建表达式 i > 5 && i <= 7
                var body = Expression.And(left, right);
    
                // 获取Lambda表达式
                var lambda = Expression.Lambda<Func<int, bool>>(body, parameter);
    
                // 通过 Compile 方法获取 Delegate
                var _r = list.Where(lambda.Compile());
    View Code

    例子3

                var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
                //list = list.Where(i => (i > 5 && i <= 7) || (i == 3)); // 要实现的表达式
    
                // 创建参数 i
                var parameter = Expression.Parameter(typeof(int), "i");
    
                // 创建常量 5
                var constant1 = Expression.Constant(5);
                // 创建比较表达式 i > 5
                var left1 = Expression.GreaterThan(parameter, constant1);
    
                // 创建常量 7
                var constant2 = Expression.Constant(7);
                // 创建比较表达式 i <= 7
                var left2 = Expression.LessThanOrEqual(parameter, constant2);
    
                // 创建常量 3
                var constant3 = Expression.Constant(3);
                // 创建比较表达式 i == 3
                var right = Expression.Equal(parameter, constant3);
    
                //创建表达式 i>5 && i<=7
                var left = Expression.And(left1, left2);
    
                //创建表达式 (i > 5 && i <= 7) || (i == 3)
                var body = Expression.Or(left, right);
    
                // 获取Lambda表达式
                var lambda = Expression.Lambda<Func<int, bool>>(body, parameter);
    
                // 通过 Compile 方法获取 Delegate
                var _r = list.Where(lambda.Compile());
    View Code

    例子4

                var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
                //var res = list.Select(i => i % 2 == 0 ? i : 0); // 要实现的表达式
    
                // 创建参数 i
                var parameter = Expression.Parameter(typeof(int), "i");
    
                //创建常量 2
                var constant1 = Expression.Constant(2);
                // 创建表达式 i % 2
                var left1 = Expression.Modulo(parameter, constant1);
    
                //创建常量 0
                var constant2 = Expression.Constant(0);
                // 创建表达式 (i % 2) == 0
                var left = Expression.Equal(left1, constant2);
    
                // 创建表达式 i % 2 == 0 ? i : 0
                var body = Expression.Condition(left, parameter, Expression.Constant(0));
    
                var lambda = Expression.Lambda<Func<int, int>>(body, parameter);
                var _r = list.Select(lambda.Compile());
    View Code

    例子5

                var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
                //list.ForEach(i => Console.WriteLine(i)); // 要实现的表达式
    
                // 创建参数i
                var parameter = Expression.Parameter(typeof(int), "i");
    
                // 获取 Console.WriteLine MethodInfo
                MethodInfo method = typeof(Console).GetMethod("WriteLine", new Type[] { typeof(int) });
    
                // 创建表达式 Console.WriteLine(i)
                var call = Expression.Call(method, parameter);
    
                var lambda = Expression.Lambda<Action<int>>(call, parameter);
                list.ForEach(lambda.Compile());
    View Code

     例子6

                var list = new List<string> { "J", "K", "L", "UI", "DAL" };
                //var res = list.Where(s => s.Length > 1); // 要实现的表达式
    
                // 创建参数 i
                var parameter = Expression.Parameter(typeof(string), "s");
    
                //创建常量 1
                var constant = Expression.Constant(1);
                // 创建属性表达式 s.Length
                var left = Expression.Property(parameter, "Length");
    
                //创建表达式 s.Length > 1
                var body = Expression.GreaterThan(left, constant);
    
                var lambda = Expression.Lambda<Func<string, bool>>(body, parameter);
                var _r = list.Where(lambda.Compile());
    View Code

    动态创建表达式树就到此为止啦!

  • 相关阅读:
    平衡二叉树(AVL Tree)
    算法分析
    稳定匹配
    Python读取不同文件夹下的图片并且分类放到新创建的训练文件夹和标签文件夹
    java构造函数也可以用private开头
    基于slf4j的log4j实战
    javascript权威指南第6版学习笔记
    hadoop之wordCount程序理解
    java 基本类型和包装类的比较
    设计模式之工厂模式,单例模式,门面模式
  • 原文地址:https://www.cnblogs.com/zuqing/p/4525804.html
Copyright © 2011-2022 走看看