这篇博客只能用来批判因为我刚刚学习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. VMware workstation安装Windows Server 2012 R2步骤详解(附下载链接)

    话不多说,直接上链接.所需工具: 1.VMware workstation 14.0(版本无所谓)                   附链接:https://pan.baidu.com/s/1CrH ...

  2. python-Web-django-路由保护

    from django.shortcuts import redirect,HttpResponse from app01.models import * import re def ddff(mod ...

  3. 【计算机视觉】背景建模之PBAS

    本文是根据M. Hofmann等人在2012年的IEEE Workshop on Change Detection上发表的"Background Segmentation with Feed ...

  4. PHP7 下安装 memcache 和 memcached 扩展

    转载自:https://www.jianshu.com/p/c06051207f6e Memcached 是高性能的分布式内存缓存服务器,而PHP memcache 和 memcached 都是 Me ...

  5. 迭代器iterator和traits编程技法

    前言 这段时间研读SGI-STL-v2.91源码,并提炼核心代码自己实现一遍,感觉受益颇深.觉得有必要写一些文章记录下学习过程的思考,行文旨在总结,会大量参考侯捷<STL源码剖析>的内容. ...

  6. Linux 网络 I/O 模型简介(图文)(转载)

    Linux 网络 I/O 模型简介(图文)(转载) 转载:http://blog.csdn.net/anxpp/article/details/51503329 1.介绍 Linux 的内核将所有外部 ...

  7. SQL SERVER GETDATE() 函数

    定义: GETDATE() 函数从 SQL Server 返回当前的时间和日期. 语法: GETDATE() 返回值: datetime型数据 例:  声明:本文是本人查阅网上及书籍等各种资料,再加上 ...

  8. Ansible-批量导入key(入门)

    系统是centos7.5 python2.75 yum install -y ansible ssh-keygen -t rsa vim /etc/ansible/hosts 定义的一个hello组: ...

  9. CW2A与CA2W

    字符串的ASCII和UNICODE之间的转换 1)Win32提供了API函数MultiByteToWideChar和WideCharToMultiByte来提供这种功能. 2)ATL还提供了另一套转换 ...

  10. ModbusTCP报文详解【一】

    [1]功能码01H [2]功能码02H [3]功能码03H [4]功能码04H