服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#表达式树讲解

C#表达式树讲解

2022-12-16 13:42痴者工良 C#

本文详细讲解了C#表达式树的创建、生成和使用,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

表达式树的概念

  • 表达式树的创建有 Lambda法 和 组装法
  • 学习表达式树需要 委托LambdaFunc<> 基础。
  • 表达式树 形状可以参考二叉树。

C#表达式树讲解

  • 可以把表达式树理解成 数学表达式。

数学表达式的所有常量、符号为表达式树的底节点。每一次计算生成的结果是一个结点,或者说他们的共同结点就是他们应该进行的运算。

C#表达式树讲解

生成表达式树

表达式树的创建有 Lambda表达式法组装法

为了方便,这里指定生成的表达式为 ( i * j ) + ( x * y )

他们的运算是这样的

C#表达式树讲解

Lambda 生成表达式树

在控制台创建应用,需要引入

using System.Linq.Expressions;

1,创建表达式

(系统自动把 Lambda表达式 转为表达式树,当然,不是所有的 Lambda表达式都能转为表达式树,详细请参考文章后面的“系统自动把 Lambda表达式 转为 表达式树” 一节)

Expression<Func<int, int, int, int, int>> func = (i, j, x, y) => (i * j) + (x * y);

2,输出系统转换的表达式

输入这一行代码后运行,看看控制台输出的表达式树

Console.WriteLine(func);

3,把代码转为数据

(把代码当作数据来使用)

var compile = func.Compile();     
            //或 Func<int, int, int, int, int> compile = func.Compile();

4,代入运算

int result = compile(12, 13, 14, 15);       //把具体数字代入表达式并运算
Console.WriteLine(result);      //输出表达式结果

完整代码如下

Expression<Func<int, int, int, int, int>> func = (i, j, x, y) => (i * j) + (x * y);
            Console.WriteLine(func);        //输出表达式

            var compile = func.Compile();       //把代码转为数据
            //或 Func<int, int, int, int, int> compile = func.Compile();

            int result = compile(12, 13, 14, 15);       //把具体数字代入表达式并运算
            Console.WriteLine(result);      //输出表达式结果
            Console.ReadKey();

控制台输出

C#表达式树讲解

组装法生成表达式树

表达式由 "符号" 和 运算符组成,。

使用ParameterExpression 类型 来修饰参数,使用Expression.Parameter(Type type,string name) 实例化参数。

1,生成 a b d 参数

        ParameterExpression a = Expression.Parameter(typeof(int), "i");
            ParameterExpression b = Expression.Parameter(typeof(int), "j");
            ParameterExpression c = Expression.Parameter(typeof(int), "x");
            ParameterExpression d = Expression.Parameter(typeof(int), "y");

C#表达式树讲解

分析:

i、j、x、y是结点名称,a、b、c、d是实例名称。不用留精力思考我上面 a b c d i j x y 的名称设定。

ParameterExpression 表示创建一个节点,Parameter表示一个命名的参数表达式,详细请参考文章后面的 “Expression 参数分类”。

Expression.Parameter(Type type,string name) 表示这个节点的属性。

2,生成结点

            Expression r1 = Expression.Multiply(a, b);      //乘法运行
            Expression r2 = Expression.Multiply(c, d);      //乘法运行

C#表达式树讲解

分析:

创建了 ( i * j ) 和 ( x * y ) 两个运算

Multiply 表示不进行溢出检查的乘法运算。Expression 里有 85种 操作方法,更多加减乘除比较大小等操作在文章后面详细附上,参考 “ 运算操作符” 一节。

3,生成终结点

Expression result = Expression.Add(r1, r2);     //相加

4,生成表达式树、转换、输出表达式树、代入数据进行运算

            Expression<Func<int, int, int, int, int>> func = Expression.Lambda<Func<int, int, int, int, int>>(result, a, b, c, d);
            var com = func.Compile();
            Console.WriteLine("表达式" + func);
            Console.WriteLine(com(12, 12, 13, 13));

完整代码如下

ParameterExpression a = Expression.Parameter(typeof(int), "i");
            ParameterExpression b = Expression.Parameter(typeof(int), "j");

            Expression r1 = Expression.Multiply(a, b);      //乘法运行
            ParameterExpression c = Expression.Parameter(typeof(int), "x");
            ParameterExpression d = Expression.Parameter(typeof(int), "y");
            Expression r2 = Expression.Multiply(c, d);      //乘法运行

            Expression result = Expression.Add(r1, r2);     //相加
            //以上代码产生结点
            //生成表达式
            Expression<Func<int, int, int, int, int>> func = Expression.Lambda<Func<int, int, int, int, int>>(result, a, b, c, d);
            var com = func.Compile();
            Console.WriteLine("表达式" + func);
            Console.WriteLine(com(12, 12, 13, 13));
            Console.ReadKey();

控制台界面

C#表达式树讲解

补充说明

1,系统自动把 Lambda表达式 转为 表达式树

对 lambda表达式 的要求 只能 由 传入参数 和 返回参数 两部分表示。lambda表达式 不能包含其它判断、循环等的代码。

错误举例

            Expression<Func<int, int, int, int, int>> func = (a, b, c, d) =>
            {
                if (a < 10)
                {
                    a += 1;
                }
                /*
                 * 其它操作代码
                 */
                return a + b + c + d;
            };

C#表达式树讲解

把那些东西通通删除,修改后:

Expression<Func<int, int, int, int, int>> func = (a, b, c, d) => a + b + c + d;

这样的 “最简” 的 lambda表达式 才能被系统自动转为表达式树

2,运算操作符

一般数学上,有加减乘除、取余、求幂等操作,而在程序中,运算操作符可以有更多的选择,达 85 种。

笔者这里给出一张图列出部分方法。

微软官方 的操作运算符列表https://docs.microsoft.com/zh-cn/dotnet/api/system.linq.expressions.expression?view=netframework-4.7.2

估计大家看微软的文档会有点不爽~这里推荐大神翻译、整理的列表

C#表达式树讲解

3,Expression 参数

以数学椭圆周长公式:L = 2πb + 4(a-b) ,a 为长半轴,b 为短半轴, 进行举例

Parameter 类似于 数学的 未知数 如 a 、 b;使用方法

ParameterExpression a = Expression.Parameter(typeof(int), "a")
ParameterExpression b = Expression.Parameter(typeof(int), "b")

Constant 表示一个常数,例如2πb 中的 2 或者 2π;使用方法

ConstantExpression define = Expression.Constant(2);

其它更多参数分类 请查看

这里附上部分截取图片

C#表达式树讲解

4,Expression 的操作方法

表示加减乘除等运算的方法。以下图举例

C#表达式树讲解

Multiply(a,b) 为乘法,Add(r1,r2)为加法。

当然,并没有这么简单,他们都有相关的重载方法和高级的使用用途。

这里给出部分截图

C#表达式树讲解

5,表达式树的高级用法

表达式树可以结合 数据库查询 或 Linq,衍生很多高级操作。

例如 动态查询、遍历表达式树、转成成SQL where 子句等等,限于幅度,笔者不再赘述。

下面的链接可以查看 System.Linq.Expressions 的所有类型对象。https://docs.microsoft.com/zh-cn/dotnet/api/System.Linq.Expressions?view=netframework-4.7.2

到此这篇关于C#表达式树讲解的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.cnblogs.com/whuanle/p/10039237.html

延伸 · 阅读

精彩推荐
  • C#C#实现的三种模拟自动登录和提交POST信息的方法

    C#实现的三种模拟自动登录和提交POST信息的方法

    这篇文章主要介绍了C#实现的三种模拟自动登录和提交POST信息的方法,分别列举了WebBrowser、WebClient及HttpWebRequest实现自动登录及提交POST的相关实现技巧,具有...

    宁静.致远5972021-11-02
  • C#C#中实现登录功能的完整步骤

    C#中实现登录功能的完整步骤

    这篇文章主要给大家介绍了关于C#中实现登录功能的相关资料,我们在使用C#做项目的时候,基本上都需要制作登录界面,需要的朋友可以参考下...

    优秀是不可能的11492022-11-22
  • C#C#连接MySQL操作详细教程

    C#连接MySQL操作详细教程

    这篇文章主要为大家详细介绍了C#连接MySQL操作详细教程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    科院唐大大3422022-08-30
  • C#C#实现几十万级数据导出Excel及Excel各种操作实例

    C#实现几十万级数据导出Excel及Excel各种操作实例

    本篇文章主要介绍了C#实现几十万级数据导出Excel及Excel各种操作实例,这里整理了详细的代码,有需要的小伙伴可以参考下。...

    成大大10452021-12-23
  • C#C#操作Excel相关方法总结

    C#操作Excel相关方法总结

    这篇文章主要介绍了C#操作Excel相关方法总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着...

    scarlett179810952022-09-28
  • C#C# 实现窗口无边框,可拖动效果

    C# 实现窗口无边框,可拖动效果

    这篇文章主要介绍了C# 实现窗口无边框,可拖动效果,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧...

    逐梦科技5842022-02-21
  • C#c#中多线程间的同步示例详解

    c#中多线程间的同步示例详解

    使用线程时最头痛的就是共享资源的同步问题,处理不好会得到错误的结果,所以下面这篇文章主要给大家介绍了关于c#中多线程间同步的相关资料,需要的朋...

    化云随风10792022-12-06
  • C#详解C#设计模式编程中的模板方法模式使用

    详解C#设计模式编程中的模板方法模式使用

    这篇文章主要介绍了C#设计模式编程中的模板方法模式,模板方法模式比较好理解,即设定好算法骨架以后进行代码的反复利用,需要的朋友可以参考下...

    learninghard7452021-11-14