这篇博客只能用来批判因为我刚刚学习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. APP安全_Android反编译

    反编译 Android的反编译工具:apktool,JEB等. Apk 文件的结构,如下: META-INF:签名文件 res:资源文件,里面的 xml 格式文件在编译过程中由文本格式转化为二进制的 ...

  2. Centos 7 忘记密码的情况下,修改root密码

    应用场景 linux管理员忘记root密码,需要进行找回操作. 注意事项:本文基于centos7.4环境进行操作,由于centos的版本是有差异的,继续之前请确定好版本 操作步骤 一.重启系统,在开机 ...

  3. Stream系列(十四)parallet方法使用

    并发 视频讲解:https://www.bilibili.com/video/av78408286/ EmployeeTestCase.java package com.example.demo; i ...

  4. git 使用详解

    Git学习文档: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 git init ...

  5. C语言Ⅰ博客作业11

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-3/homework/10130 我在这个课程的 ...

  6. #学习笔记:CentOS7学习之十三(2):磁盘介绍与管理

    1.磁盘分区工具与挂载 1.1 硬盘分区符认识: MBR概述:全称为Master Boot Record,即硬盘的主引导记录. 硬盘的0柱面.0磁头.1扇区称为主引导扇区(也叫主引导记录MBR).它由 ...

  7. 分库分表之后,id 主键如何处理

    基于数据库的实现方案 数据库自增 id 这个就是说你的系统里每次得到一个 id,都是往一个库的一个表里插入一条没什么业务含义的数据,然后获取一个数据库自增的一个 id.拿到这个 id 之后再往对应的分 ...

  8. Highest Frequency Letters

    Given a list of strings, output the most frequent characters that are in the same group as the lette ...

  9. 新浪随机图片壁纸API接口 刷新网页换背景接口

    刷新一次页面换一次图片,可以调用到你的网站背景里面去,多炫酷啊,刷新一下本页看下效果哦. 说明:随机图片壁纸api,调用的是新浪api,速度不用担心,图片资源也很多 电脑动漫图片:http://api ...

  10. django 聚合统计查询

    from django.shortcuts import renderfrom django.http import HttpResponsefrom django.db.models import ...