这篇博客只能用来批判因为我刚刚学习linq对它了解只有简单的linq to sql 的语句所以来写这个博客只能说是班门弄斧了,看的下去的话就坚持看吧。

在网上看了别人的文章目前水平有限借鉴别人的思想吧。

描述:表达式树是将我们原来可以直接由代码编写的逻辑以表达式的方式存储在树状的结构里,从而可以在运行时去解析这个树,然后执行,实现动态的编辑和执行代码。

示例:

  void Main()
  {
 
  Expression<Func<int,int>> tree = x=>x+1;
  Func<int,int> exp= x=> x+1;
 
  tree(1);//'tree' is a 'variable' but is used like a 'method'(“树”是一个“变量”,但使用的是“方法”)
   exp(1);//输出2
  }
如果用Console.WriteLine(tree.ToString());  // x=> (x + 1)输出结果是x=> (x + 1)tree只是lambada表达式的树形结构信息,并不是函数可以直接调用
 
上面的  Expression<Func<int,int>> tree = x=>x+1;左面  Expression<Func<int,int>> tree 是一个树,
右面   x=>x+1是一个表达式,Func<int,int>中的两个类型是这样的最后一个类型是返回值的类型前面的是参数类型对于表达式 x=>x+1来说参数x类型为int最后
计算结果返回值类型也会是int。而  Func<int,int>又是作为 Expression<T>中的类型它的类型是一个表达式,就好像这个树是由最底层的单个
参数和一些逻辑操作,运算操作等一级一级构成(这是我个人目前的理解不对请指正)
但是不管怎么构建这棵树我们的目的还是要使用它的,所以怎样使用呢?
那就是Compile()函数了,它由Expression类提供,下面是使用:
Func<int,int> fun= tree.Compile();
fun(3).Dump();//用来输出
上面可能不直观那看下面: ConstantExpression ce1 = Expression.Constant(10);//这个没有什么好疑义的就是返回10这个常量
Expression<Func<int>> exp = Expression.Lambda<Func<int>>(ce1);

Console.WriteLine(exp.Compile().Invoke());
 
 下面我们来看怎样构建一个表达式树:

首先看几个类型


下面看代码:(直角三角形的判断)
1.创建参数
 ParameterExpression expX= Expression.Parameter(typeof(int),"x");
ParameterExpression expY= Expression.Parameter(typeof(int),"y");
ParameterExpression expZ= Expression.Parameter(typeof(int), "z");
2.计算
 BinaryExpression mulX = Expression.Multiply(expX, expX);
BinaryExpression mulY= Expression.Multiply(expY, expY);
BinaryExpression mulZ= Expression.Multiply(expZ, expZ);
 BinaryExpression addXY = Expression.Add(mulX,mulY);
3.最后的关联
 BinaryExpression final= Expression.Equal(mulZ, addXY);

如果感觉欠缺点什么,那么看下面我们把它放到程序main中是不是更直观一点呢?
 
  void Main()
  {
  ParameterExpression expX= Expression.Parameter(typeof(int),"x");
  ParameterExpression expY= Expression.Parameter(typeof(int),"y");
  ParameterExpression expZ= Expression.Parameter(typeof(int), "z");
  BinaryExpression mulX= Expression.Multiply(expX, expX);
  BinaryExpression mulY= Expression.Multiply(expY, expY);
  BinaryExpression mulZ= Expression.Multiply(expZ, expZ);
  BinaryExpression addXY = Expression.Add(mulX,mulY);
 BinaryExpression final= Expression.Equal(mulZ, addXY);//(x*x + y*y)== z*z
 Expression<Func<int, int, int, bool>> square = Expression.Lambda<Func<int, int, int, bool>>(final, expX, expY, expZ);
 Func<int, int, int, bool>  result= square.Compile();
 result result(3,4,5).Dump();
 }
 
 
 结果:
 True
似乎明白了一些吧,但是感觉还是不够清晰不够有条理性,因为目前能力有限只能零星的了解等进一步的学习后希望会有一个系统的深入了解。
后面的任意参数构建、以及树的遍历还会抽时间学习,最近确实时间不够多,只能抽时间看看,人家一小时学会那么我就话更多的时间去学,可
能我个人速度慢消化的少但是会继续努力,我相信总会学会的。之后还会继续追加内容的。

 
 
 

Linq表达树(固定参数)的更多相关文章

  1. c#LINQ表达树

    如果你已经用过LINQ, 你应该知道函数方式,以及包含的丰富的类库, 如果你仍不了解, 那根据下面的链接去熟悉一下 the LINQ tutorial,  lambda. 表达树提供了丰富的包含参数的 ...

  2. C# - LINQ 表达式树

    表达式树(Expression Tree) 表达式树是不可执行的代码,它只是用于表示一种树状的数据结构,树上的每一个节点都表示为某种表达式类型,大概有25种表达式类型,它们都派生自Expression ...

  3. 大白话5分钟带你走进人工智能-第二十六节决策树系列之Cart回归树及其参数(5)

                                                    第二十六节决策树系列之Cart回归树及其参数(5) 上一节我们讲了不同的决策树对应的计算纯度的计算方法, ...

  4. 函数的非固定参数-Day3

    一.函数非固定参数 1.默认函数,我们在传参之前,选给参数指定一个默认的值.默认参数特点是非必须传递的. def test(x,y=2): print(x) print(y) print(" ...

  5. 函数和常用模块【day04】:函数的非固定参数(三)

    本节内容 1.概述 2.默认参数 3.参数组 4.总结 一.概述 在上一篇博客中我已经写了,位置参数和关键字参数,下面我们来谈谈默认参数和参数组 二.默认参数 默认参数指的是,我们在传参之前,先给参数 ...

  6. 非固定参数:*args和 **kwargs

    先看一个固定参数栗子: def func1(x, args): print(x, args) func1(1,22) ====================1 22 ================ ...

  7. 【python】-- 函数非固定参数,返回值(return)

    函数非固定参数 1.默认参数: 代码如下: def information_register(name,age,country,sex): print("----注册信息------&quo ...

  8. HandlerMethodArgumentResolver(二):Map参数类型和固定参数类型【享学Spring MVC】

    每篇一句 黄金的导电性最好,为什么电脑主板还是要用铜? 飞机最快,为什么还有人做火车? 清华大学最好,为什么还有人去普通学校? 因为资源都是有限的,我们现实生活中必须兼顾成本与产出的平衡 前言 上文 ...

  9. python学习第二十六天非固定参数几种情况

    python函数参数传递,位置参数,默认参数,关键词参数,最后介绍一个非固定参数,就可以向函数传递一个列表,元组,字典,具体看看用法 1,有一个* 号的参数情况 def goos_stu(id,*us ...

随机推荐

  1. Linux 查看修改SWAP大小

    1  查看swap 空间大小(总计):     # free -m          默认单位为k, -m 单位为M                total       used       fre ...

  2. vue后端返回路由表来进行权限管理,加载指定路由结构,不包含则不加载

    创建vue项目,配置环境变量,后续需要用到.这里只配置生产环境和开发环境. 项目根目录创建 .env.production 文件 NODE_ENV=production VUE_APP_URL=htt ...

  3. kali破解wifi密码

    开始 1.选择合适的网卡,有些网卡kali识别不了,我用的网卡信息 2.网卡开启监听模式 3.查看监听模式是否开启成功(网卡名称变成wlan0mon说明已经开启成功) 4.输入“airodump-ng ...

  4. 【VS开发】【C/C++开发】printf缓冲区刷新

    printf之缓冲区小结: 今天调试程序,发现了一个有趣的现象,printf函数没有按照预期的结果输出重复的字符串,单步调试显示代码的确走到了打印屏幕的分支,没有显示不由得想到了是不是缓冲区去刷新的问 ...

  5. ES6中Set和Map

    1.Set 实例的创建 Set实例它类似于数组,但是成员的值都是唯一的,没有重复的值. Set本身是一个构造函数用来生成Set数据结构. Set 函数可以接受一个数组(或者具有 iterable 接口 ...

  6. git 命令 git diff 查看 Git 区域文件的具体改动

    查看 Git 区域文件的具体改动 git diff git status 只能让我们知道文件在 Git 区域内的改动状态,但如果我们想查看某个文件内具体改了什么(也可以理解为在不同 Git 区域中的差 ...

  7. kafka原理和操作

    参考: 原理: https://www.cnblogs.com/yinzhengjie/p/9780976.html 常用配置参数: https://www.cnblogs.com/yinzhengj ...

  8. [转帖]开源的监控技术栈除了ELK,还有InfluxData的TICK

    开源的监控技术栈除了ELK,还有InfluxData的TICK   https://cloud.tencent.com/developer/news/357119 来源 | Influxdata 译者 ...

  9. [转帖]华为Mate20 X 5G版拆解:巴龙5000还配备了3GB独立内存!

    华为Mate20 X 5G版拆解:巴龙5000还配备了3GB独立内存! 投递人 itwriter 发布于 2019-07-29 21:35 评论(7) 有1733人阅读 原文链接 [收藏] « » h ...

  10. MySQL优化——索引

    内容来自:https://yq.aliyun.com/articles/214494?utm_content=m_31338 对此我们来详细分析下(也就是大家在面试时需要说的): 场景一,数据表规模不 ...