如何使用 C# 中的 Lambda 表达式

.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 integers = new List { 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 lambdaexpression 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

你可能感兴趣的:(.net)