对于拉姆达,许多文章都讲过原理及如何使用,所以这篇文章我主要是摘录我学习过的文字,总结下我自己的学习心得。
什么是拉姆达表达式
"Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量。它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式。所有Lambda表达式都使用Lambda运算符=>,该运算符读作"goes to"。Lambda运算符的左边是输入参数(如果有),右边是表达式或语句块。
Lambda表达式Lambda表达式是由.NET 2.0演化而来的,也是LINQ的基础,熟练地掌握Lambda表达式能够快速地上手LINQ应用开发。
Lambda表达式在一定程度上就是匿名方法的另一种表现形式
//匿名方法 IEnumerable<People> results = people.Where (delegate(People p) { return p.age > 20; }); //拉姆达表达式 IEnumerable<People> results = people.Where(People => People.age > 20);
使用示例
(x, y) => x * y //多参数,隐式类型=> 表达式 x => x * 5 //单参数, 隐式类型=>表达式 x => { return x * 5; } //单参数,隐式类型=>语句块 (int x) => x * 5 //单参数,显式类型=>表达式 (int x) => { return x * 5; } //单参数,显式类型=>语句块 () => Console.WriteLine() //无参数
以上述格式都是Lambda表达式的合法格式,在编写Lambda表达式时,可以忽略参数的类型,因为编译器能够根据上下文直接推断参数的类型。
Lambda的进阶用法
一、闭包
var a = 5; Func<int,int> multiplyWith = x => x * a; var result1 = multiplyWith(10); //50 a = 10; var result2 = multiplyWith(10); //100
我们可以在Lambda表达式中用到外面的变量,没错,也就是传说中的闭包啦。
void DoSomeStuff() { var coeff = 10; Func<int,int> compute = x => coeff * x; Action modifier = () => { coeff = 5; }; var result1 = DoMoreStuff(compute); ModifyStuff(modifier); var result2 = DoMoreStuff(compute); } int DoMoreStuff(Func<int,int> computer) { return computer(5); } void ModifyStuff(Action modifier) { modifier(); }