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表达式通常用于与委托类型(如Func
、Action
和自定义委托)配合使用。
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方法(如Where
、Select
等)接受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;
编译器会推断x
为int
类型,因此不需要显式声明参数类型。
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查询中用于筛选、投影等操作。
事件处理程序中实现简洁代码。
捕获外部变量,形成闭包。