1、学习资料

匿名函数 C#编程指南http://msdn.microsoft.com/zh-cn/library/bb882516.aspx

Lambda表达式 C#编程指南http://msdn.microsoft.com/zh-cn/library/bb397687.aspx

Lambda表达式和Lambda表达式树http://blog.csdn.net/sytweibo/article/details/5542926

Lambda表达式学习http://www.cnblogs.com/kingmoon/archive/2011/05/03/2035696.html

2、介绍

在 C# 1.0 中,您通过使用在代码中其他位置定义的方法显式初始化委托来创建委托的实例。

C# 2.0 引入了匿名方法的概念,作为一种编写可在委托调用中执行的未命名内联语句块的方式。

C# 3.0 引入了 Lambda 表达式,这种表达式与匿名方法的概念类似,但更具表现力并且更简练。 这两个功能统称为“匿名函数”。 通常,针对 .NET Framework

        delegate void TestDelegate(string s);
static void M(string s)
{
Console.WriteLine(s);
}
static void Main(string[] args)
{
       //C#1.0委托调用
       TestDelegate testDel1 = new TestDelegate(M);
       //C#2.0匿名方法
       TestDelegate testDel2 = delegate(string s)
{
Console.WriteLine(s);
};
       //C#3.Lambda表达式
       TestDelegate testDel3 =
(s) =>
{
Console.WriteLine(s);
};
testDel1("C#1.0");
testDel2("C#2.0");
testDel3("C#3.0");
Console.ReadKey();
}

版本 3.5 及更高版本的应用程序应使用 Lambda 表达式。

lambda 表达式是一个可用于创建委托或表达式树类型的匿名函数。 通过使用 lambda 表达式,可以可作为参数或返回编写本地函数,该函数调用的值。 Lambda 表达式用于编写 LINQ 查询表达式特别有用。

若要创建 lambda 表达式,则在 lambda 运算符 =>的左侧指定输入参数 (如果有),因此,您放置表达式或语句在另一端块。 例如,lambda 表达式 x => x * x 指定名为 x 的参数并返回 x 的值计算的。

Lambda表达式概念

–“Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。
–Lambda表达式是对.NET2.0中匿名方法在语法形式上的进一步改进 
var inString = list.FindAll(delegate(string s) { return s.Indexof("YJingLee") >= 0; });
–使用Lambda表达式代码将更自然易懂 var inString = list.FindAll(s => s.Indexof("YJingLee") >= 0);
–语法:Lambda表达式格式为:(参数列表)=>表达式或语句块
–Lambda 表达式和 匿名方法其实是一件事情。他们的作用都是:产生方法。即内联方法。
–Lambda表达式式范例:
  string[] list = new string[] { “abc”, “12”, “java” }; 
  string[] alist = Array.FindAll(list, s => (s.IndexOf(“a”) >= 0)); 
   //x的类型省略了,编译器可以根据上下文推断出来,后面跟着的是表达式 x => x+1  deleage(int x){return x+1;}
  //后面跟着的是语句块 x=>{return x+1;} delegate(int x){return x+1;}
  //输入参数也可以带类型,带类型后别忘记小括号 (int x) => x+1 delegate(int x){return x+1;}
  //也可以多个输入参数,逗号分隔,别忘记小括号 (x,y) => x+y delegate(int x,int y){return x+y;}
  //无参的也行 () => 1delegate(){return 1;}
    Lambda表达式可以有多个参数、一个参数,或者没有参数。其参数类型可以隐式或者显式。示例代码如下:
 1.(x, y) => x * y         //多参数,隐式类型=> 表达式 
  2.x => x * 5              //单参数, 隐式类型=>表达式 
  3.x => { return x * 5; }      //单参数,隐式类型=>语句块 
  4.(int x) => x * 5            //单参数,显式类型=>表达式 
  5.(int x) => { return x * 5; }      //单参数,显式类型=>语句块 
  6.() => Console.WriteLine()   //无参数
•Lambda 表达式树概念
•Expressions Tree 概念
–表达式树又称为表达式目录树,以数据形式表示语言级代码。所有的数据都存储在树结构中,每个结点表示一个表达式(Expression)。
–Lambda表达式树允许我们像处理数据(比如读取,修改)一样来处理Lambda表达式。
•表达式的种类
–参数表达式:meterExpression,就是一个方法中的参数,例如search(string key),key可以看成是一个参数表达式。
–二元表达式:BinaryExpression,例如a+b等。
–方法调用表达式:MethodCallExpression,例如:自定义LINQ提供程序中实现orderby 的操作
–常数表达式:ConstantExpression,例如数值5
–字段或属性表达式:MrExpression,例如str.Length。Expression.Property(pe,typeof(string).GetProperty("Length"));
–带有条件运算的表达式:ConditionalExpression
–描述lambda表达式:LambdaExpression
–一元运算符的表达式:UnaryExpression
–表达式和类型之间的相关操作:TypeBinaryExpression等等,它们都继承Expression
•C# Lambda表达式树要点
C# Lambda表达式树允许我们像处理数据(比如读取,修改)一样来处理Lambda表达式。
–Lambda表达式的参数类型可以忽略,因为可以根据使用的上下文进行推断。
–Lambda表达式的主体(body)可以是表达式,也可以是语句块。
–Lambda表达式传入的实参将参与类型推断,以及方法重载辨析。
–Lambda表达式和表达式体可以被转换为表达式树。

表达式树允许lambda表达式能够代表数据结构替代表示为执行代码。

Lambda前世今生的更多相关文章

  1. Linq基础必备

    1.linq基础必备之对象初始化器和匿名类型因果分析   3. 一:对象初始化器 1.就是在new的时候给公共属性赋值的一种方式 2. 在没有初始化器之前的时候,我们是怎么初始化的呢??? 1. 构造 ...

  2. Lambda的前世今生

    先看一段代码吧 class Student{ delegate void Say(string content); public void Show() { //Lambda的前世今生 //总结:La ...

  3. Linq快速入门——Lambda表达式的前世今生

    Linq快速入门——Lambda表达式的前世今生   Lambda表达式其实并不陌生,他的前生就是匿名函数,所以要谈Lambda表达式,就不得不谈匿名函数,要谈匿名函数,那又要不得不谈委托. 何为委托 ...

  4. Lambda表达式的前世今生

    Lambda 表达式 早在 C# 1.0 时,C#中就引入了委托(delegate)类型的概念.通过使用这个类型,我们可以将函数作为参数进行传递.在某种意义上,委托可理解为一种托管的强类型的函数指针. ...

  5. [C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性

    回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性 序 目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段.C# 6.0 ...

  6. 主成分分析PCA的前世今生

    这篇博客会以攻略形式介绍PCA在前世今生. 其实,主成分分析知识一种分析算法,他的前生:应用场景:后世:输出结果的去向,在网上的博客都没有详细的提示.这里,我将从应用场景开始,介绍到得出PCA结果后, ...

  7. Python之路【第一篇】:Python前世今生

    Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解 ...

  8. 你好,C++(1)C++是什么?C++的“前世今生”

    The world is built on C++. ——Herb Sutter the chairman of the ISO C++ standards committee and chief n ...

  9. Python前世今生

    Python前世今生   Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时 ...

随机推荐

  1. C/C++程序基础

    作为一名cocos2dx前端(客户端)开发,知乎上看到一片文章,怎么看待做手游cocos前端开发,lua用的多,c++用的少面试会被鄙视? 为了不被鄙视,所以要学好C++,多做积累.本文主要是根据&l ...

  2. EasyUI datagrid组件绑定有转义字符的json数据出错

    最近项目中一个页面的datagrid出现了莫名其妙的问题, 首先是分页数据的第二页和第三页不能展示,过了一天后第一页也出不来了, 默认首页不出来导致后续分页处理无法进行, 整个数据都不出来了,最后只能 ...

  3. Win2D 官方文章系列翻译 - DPI (每英寸点数)和 DIPs(设备独立像素)

    本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-dpi-dips/ 本文旨在解释物理像素与设备独立像素(DIPs, device independent pi ...

  4. [翻译]你真的知道你看到的UTF-8字符是什么吗?

    翻译自http://www.pixelstech.net/article/1397877200-You-know-what-UTF-8-is-when-you-see-it- Source : son ...

  5. MyBatis框架

    MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的xml或者注解用于 ...

  6. x86_64 Ubuntu 14.04 LST安装gcc4.1.2 转载

    由于编译源码软件需要用到gcc4.1.2版本,但是本机已经安装有gcc4.8.4,下载gcc4.1.2源码编译总会出现运行找不到库文件错误,或者i386和x86_64不兼容问题,在http://ask ...

  7. 学习练习 Oracle数据库小题

    Course(课程表) Score(成绩表) Teacher(教师表)

  8. windows网络编程-2015.12.29

    在windows环境下,使用netstat命令查看网络状态,具体命令如下所示: netstat -ano | findstr listenport 在windows环境下,创建udp程序接收端,具体代 ...

  9. 【Linux】Zabbix + MPM + msmtp + mutt 监控MySQL + 邮件报警

    Zabbix部署参考博文 http://blog.sina.com.cn/s/blog_5611597901017oe0.html  MPM安装配置参考博文和MPM官网下载地址 http://blog ...

  10. 关于hbase的read操作的深入研究 region到storefile过程

    这里面说的read既包括get,也包括scan,实际底层来看这两个操作也是一样的.我们将要讨论的是,当我们从一张表读取数据的时候hbase到底是怎么处理的.分二种情况来看,第一种就是表刚创建,所有pu ...