C# Lambda 表达式

Lambda表达式是C#中定义匿名函数的一种简洁语法,它常用于处理委托、LINQ查询、以及其他需要传递小型代码片段的场景。Lambda表达式可以让代码更加简洁、直观。下面我们来深入探讨Lambda表达式的用法和特点。

1. 基本语法

Lambda表达式的基本语法如下:

 (参数列表) => 表达式或代码块;
  • 参数列表:Lambda表达式接受的输入参数。如果只有一个参数,括号可以省略;如果没有参数,则需要用空括号()

  • =>:Lambda运算符,用于分隔参数列表和表达式主体。

  • 表达式或代码块:Lambda表达式的主体,可以是一个简单的表达式(用于单行代码)或用{ }包裹的代码块(用于多行代码)。

2. 示例

简单Lambda表达式

单行Lambda表达式可以直接写出表达式结果:

 Func<int, int> square = x => x * x;
 Console.WriteLine(square(5)); // 输出 25

在这个例子中,x => x * x是一个Lambda表达式,接受一个整数x,并返回它的平方。Func<int, int>表示这是一个接受int并返回int的委托。

多行Lambda表达式

如果Lambda表达式包含多行代码,需要用{ }包裹整个代码块,并用return返回结果:

 Func<int, int, int> add = (a, b) =>
 {
     int sum = a + b;
     return sum;
 };
 Console.WriteLine(add(3, 4)); // 输出 7

在这个例子中,(a, b) => { int sum = a + b; return sum; }是一个多行Lambda表达式。

3. Lambda表达式与委托类型

Lambda表达式通常用于与委托类型(如FuncAction和自定义委托)配合使用。

  • Func:表示一个可以返回值的委托。

     Func<int, int, int> multiply = (x, y) => x * y;
     Console.WriteLine(multiply(2, 3)); // 输出 6
  • Action:表示一个不返回值的委托。

     Action<string> greet = name => Console.WriteLine($"Hello, {name}");
     greet("Alice"); // 输出 "Hello, Alice"
  • Predicate:表示一个返回bool类型的委托,常用于条件判断。

     Predicate<int> isEven = x => x % 2 == 0;
     Console.WriteLine(isEven(4)); // 输出 true

4. Lambda表达式在LINQ中的应用

Lambda表达式在LINQ中得到了广泛应用。LINQ方法(如WhereSelect等)接受Lambda表达式作为参数,用于定义查询条件或选择器。

Where筛选

Where用于筛选集合中满足特定条件的元素:

 List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
 var evenNumbers = numbers.Where(n => n % 2 == 0);
 foreach (var n in evenNumbers)
 {
     Console.WriteLine(n); // 输出 2, 4, 6
 }

Select投影

Select用于将集合中的每个元素投影到新的形式:

 var squares = numbers.Select(n => n * n);
 foreach (var square in squares)
 {
     Console.WriteLine(square); // 输出 1, 4, 9, 16, 25, 36
 }

5. 捕获外部变量

Lambda表达式可以捕获定义在其外部的变量,这称为“闭包”。Lambda表达式在执行时会保留对外部变量的引用,即使这些变量已超出其原来的作用域。

 int multiplier = 3;
 Func<int, int> multiply = x => x * multiplier;
 Console.WriteLine(multiply(5)); // 输出 15
 multiplier = 5;
 Console.WriteLine(multiply(5)); // 输出 25

在这个例子中,Lambda表达式捕获了变量multiplier,并在每次调用时使用它的当前值。

6. Lambda表达式与事件处理

Lambda表达式常用于事件处理程序中,因为它可以简化事件绑定的代码。

 button.Click += (sender, e) => Console.WriteLine("Button clicked!");

7. Lambda表达式的类型推断

C#编译器可以自动推断Lambda表达式的参数类型,这让代码更加简洁。例如:

 Func<int, int> square = x => x * x;

编译器会推断xint类型,因此不需要显式声明参数类型。

8. 表达式Lambda与语句Lambda

  • 表达式Lambda:主体仅为单个表达式,直接返回结果,不需要return关键字。

     Func<int, int> square = x => x * x;
  • 语句Lambda:主体包含多条语句时,需要用{ }包裹并显式return返回值(如果需要)。

     Func<int, int> square = x =>
     {
         int result = x * x;
         return result;
     };

总结

Lambda表达式使C#代码更具表现力,广泛用于:

  • 定义简洁的委托和匿名方法。

  • LINQ查询中用于筛选、投影等操作。

  • 事件处理程序中实现简洁代码。

  • 捕获外部变量,形成闭包。


C# Lambda 表达式
http://localhost:8090/archives/lambda-expression
作者
Administrator
发布于
2024年10月29日
许可协议