概述
Lambda 表达式的本质就是匿名函数。(而匿名方法的本质是委托)
“Lambda 表达式”是一个匿名函数,可以包含表达式和语句,并且可用于创建委托或表达式树类型。 (Lambda 表达式的运算符为 =>,读作“goes to”。=> 运算符具有与赋值运算符(=)相同的优先级)
Lambda 的基本形式是:
(input parameters) => expression
只有在 Lambda 有一个输入参数时,括号才是可选的,否则括号是必需的。
两个或更多输入参数由括在括号中的逗号分隔: (x, y) => x==y 。
有时,编译器难于或无法推断输入类型。如果出现这种情况,您可以按以下示例中所示的方式显式指定类型:
(int x, string s) => s.Length > x
使用空括号指定零个输入参数:
() => SomeMethod()
最常用的场景是 IEnumerable 和 IQueryable 接口的 Where(c => c.Id > 3) 。
下列规则适用于 Lambda 表达式中的变量范围:
捕获的变量将不会被作为垃圾回收,直至引用变量的委托超出范围为止。
在外部方法中看不到 Lambda 表达式内引入的变量。
Lambda 表达式无法从封闭方法中直接捕获 ref 或 out 参数。
Lambda 表达式中的返回语句不会导致封闭方法返回。
Lambda 表达式不能包含其目标位于所包含匿名函数主体外部或内部的 goto 语句、break 语句或 continue 语句。
Lambda 表达式缩写推演
new Func<string, int>(delegate (string str) { return str.Length; }); delegate (string str) { return str.Length; } //匿名方法 (string str) => { return str.Length; } //Lambda语句 (string str) => str.Length //Lambda表达式 (str) => str.Length //让编译器推断参数类型 str => str.Length //去掉不必要的括号
应用实例
一、
delegate int AddDel(int a, int b); //定义一个委托(与类同级) #region AddDel fun = delegate (int a, int b) { return a + b; }; //匿名函数 AddDel funLambda = (a, b) => a + b; //lambda本质就是匿名函数(lambda参数类型可以进行隐式推断,可以省略类型) //Console.WriteLine(fun(1, 3)); List<string> strs = new List<string>() { "1", "2", "3" }; var temp = strs.FindAll(s => int.Parse(s) > 1); foreach(var item in temp) { Console.WriteLine(item); } //Console.WriteLine(funLambda(1, 3)); #endregion
二、
static bool GetEvenNum(int num) { if(num % 2 == 0) { return true; } return false; } List<int> nums = new List<int>() { 1, 2, 3, 4, 6, 9, 12 }; //使用委托方式 List<int> evenNums = nums.FindAll(GetEvenNum); foreach(var item in evenNums) { Console.WriteLine(item); } Console.WriteLine("使用 lambda 的方式"); List<int> evenNumLambda = nums.FindAll(n => n % 2 == 0); foreach (var item in evenNumLambda) { Console.WriteLine(item); } Console.ReadKey();