这篇博客只能用来批判因为我刚刚学习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. spring-boot集成6:集成redis实现字典缓存功能

    Why redis? redis是基于内存的key-value系统,可以用作缓存中间件或者消息中间件,spring-boot提供了方便的方式和redis集成. 1.maven依赖 <!--red ...

  2. 【Flink】flink执行jar报错:java.io.IOException: Error opening the Input Split file 或者 java.io.FileNotFoundException

    报错内容 flink执行jar时,报如下错误: org.apache.flink.client.program.ProgramInvocationException: Job failed. (Job ...

  3. HBASE概念补充

    HBASE概念补充 HBase的工作方式: hbase中的表在行的方向上分隔为多个HRegion,分散在不同的RegionServer中 这样做的目的是在查询时可以将工作量分布到多个RegionSer ...

  4. 拿下id_rsa

    ssh配置公私钥远程登录Linux主机 ssh-keygen cat id_rsa.pub >>authorized_keys cat authorized_keys 拿下id_rsa h ...

  5. Windows 下部署 hadoop spark环境

    一.先在本地安装jdk 我这里安装的jdk1.8,具体的安装过程这里不作赘述 二.部署安装maven 下载maven安装包,并解压 设置环境变量,MAVEN_HOME=D:\SoftWare\Mave ...

  6. Linux、Aix(unix)、Oracle 银行外包开发运维常用命令

    我一直是银行外包开发人员,常用的操作命令固然少不了,这是我一次自己边添加边使用的笔记.内容有点乱,希望可以帮到你. rm 文件或目录rm -f 文件或目录rm -rf * 跑路的时候用du -h 文件 ...

  7. Resistors in Parallel(找规律+大数)

    题意:https://codeforces.com/group/ikIh7rsWAl/contest/254825/problem/E 给你一个n,计算n / Sigma(1~n)的d(是n的只出现一 ...

  8. HTML DOM focus() 方法

    目录 HTML DOM focus() 方法 实例 定义和使用 浏览器支持 语法 参数 技术描述 更多实例 实例 实例 HTML DOM focus() 方法 实例 为 <a> 元素设置焦 ...

  9. SSD目标检测实战(TF项目)——人脸检测2

    数据转化为VOC格式: 一.我们先看 VOC格式的数据是什么??? Annotations:存放xml 包括 文件夹信息   图片名称. 图片尺寸信息. 图片中object的信息. JPEGImage ...

  10. Spectral Norm Regularization for Improving the Generalizability of Deep Learning论文笔记

    Spectral Norm Regularization for Improving the Generalizability of Deep Learning论文笔记 2018年12月03日 00: ...