.NET 3.5 中引入了 Lambda 表达式
,它的呈现也让 Linq 真正的落地,Lambda 表达式
像一个匿名办法,但比匿名办法更具备灵活性,当应用 lambda 表达式时,你不须要指定输出参数的类型,也就看得出 Lambda 表达式
具备更短更洁净的个性。
分析 lambda 表达式
从实质上来说,Lambda 表达式
就是一个不须要当时定义的办法,没有办法名,也没有拜访修饰符,lambda 表达式 能够分成两局部来了解,即 右边
和 左边
,前者示意办法的入参,后者示意办法体。
上面是 lambda 表达式 的语法结构。
(Input parameters) => Expression or statement block
lambda 表达式 反对两种语法结构,即:expression
和 statement
,什么意思呢?
expression
就是 右边的 input + 左边的 表达式,如果比拟懵的话,看如下代码:
input => expression;
statement
就是 右边的 input + 左边的可反对多语句的{}
组成,不明确的话,请看如下代码:
input => {statements};
Lambda 表达式的案例展现
手写 lambda 表达式真的是太简略了,你仅仅须要移除原来 匿名办法 模式下的 delegate
和 入参类型
, 先来看一下 匿名办法 怎么写。
delegate(Author a) {return a.IsActive && a.NoOfBooksAuthored > 10;}
接下来把下面的 匿名办法 转成 lambda 表达式,代码如下:
(a) => {a.IsActive && a.NoOfBooksAuthored > 10;}
下面的 a
就是办法参数,=>
是 lambda 操作符,前面的办法体就是具体逻辑。
再看 lambda 表达式 的另一个案例,它展现了如何将 1-9
中的奇数输入到控制台中。
List<int> integers = new List<int> {1, 2, 3, 4, 5, 6, 7, 8, 9};
foreach(int num in integers.Where(n => n % 2 == 1).ToList())
{Console.WriteLine(num);
}
无参的 lambda 表达式
lambda 表达式 能够无参也能够多参,上面的代码片段展现了一个无参的 lambda 表达式。
() => Console.WriteLine("This is a lambda expression without any parameter");
上面的代码片段展现了一个应用 多参 的 lambda 表达式。
(a, numberOfBooksAuthored) => a.NoOfBooksAuthored >= numberOfBooksAuthored;
也能够在 lambda 表达式中指定某一个参数的具体类型,代码如下:
(a, int numberOfBooksAuthored) => a.NoOfBooksAuthored >= numberOfBooksAuthored;
你甚至能够在 lambda 表达式中应用多条语句,记得用 {}
包起来即可,如下代码所示:
(a, 10) =>
{
Console.WriteLine("This is an example of a lambda expression
with multiple statements");
return a.NoOfBooksAuthored >= 10;
}
statement lambda 剖析
其实 statement lambda
和 expression lambda
应用的语法格局都是一样的,惟一不一样的中央在于,前者的左边局部是用 {}
模式的,也就是反对多条语句的块模式,而后者只反对一条语句。
上面的代码片段展现了如何应用 statement lambda
将 1-9 中的奇数输入到管制台上。
int[] integers = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9};
foreach (int i in integers.Where(x =>
{if (x % 2 == 0)
return true;
return false;
}
))
Console.WriteLine(i);
Lambda 表达式 是一个平凡的个性,它将 匿名办法 简化到了极致,而且 lambda 表达式还反对任意多个入参,你甚至还能够将 lambda 表达式 赋给 Func,Action 或 Predicate 委托,在后续的文章中,咱们会探讨 lambda 更多的高级玩法,以及 Linq 和 异步 lambda。
译文链接:https://www.infoworld.com/art…
更多高质量干货:参见我的 GitHub: csharptranslate