Lambda前世今生
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.0Lambda表达式
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 //多参数,隐式类型=> 表达式
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表达式能够代表数据结构替代表示为执行代码。