1. Lambda 表达式简介
Lambda 表达式是 C# 3.0 引入的一种简洁的匿名函数语法,它允许你以更紧凑的方式编写内联函数。Lambda 表达式广泛应用于 LINQ 查询、事件处理、委托赋值等场景,是现代 C# 开发中不可或缺的特性。
2. Lambda 表达式的基本语法
Lambda 表达式的基本语法由输入参数、Lambda 运算符(=>)和表达式或语句块组成:
csharp
// 表达式形式
(input-parameters) => expression
// 语句块形式
(input-parameters) => { statements; }
3. Lambda 表达式的类型
3.1 表达式 Lambda
当 Lambda 表达式只有单个表达式时,可以省略大括号和 return 语句:
csharp
Func<int, int> square = x => x * x;
Console.WriteLine(square(5)); // 输出:25
3.2 语句 Lambda
当 Lambda 表达式包含多个语句时,需要使用大括号:
csharp
Action<string> greet = name =>
{
string greeting = $"Hello, {name}!";
Console.WriteLine(greeting);
};
greet("World"); // 输出:Hello, World!
4. Lambda 表达式的参数
4.1 显式类型参数
csharp
Func<int, int, int> add = (int x, int y) => x + y;
4.2 隐式类型参数
csharp
Func<int, int, int> multiply = (x, y) => x * y;
4.3 无参数 Lambda
csharp
Func<string> getMessage = () => "Hello from Lambda!";
5. Lambda 表达式的应用场景
5.1 LINQ 查询
csharp
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);
// 结果:2, 4
5.2 事件处理
csharp
button.Click += (sender, e) =>
{
MessageBox.Show("按钮被点击了!");
};
5.3 委托赋值
csharp
Predicate<int> isPositive = x => x > 0;
bool result = isPositive(10); // true
6. 捕获外部变量(闭包)
Lambda 表达式可以捕获其外部作用域的变量,形成闭包:
csharp
int factor = 2;
Func<int, int> multiplier = n => n * factor;
Console.WriteLine(multiplier(5)); // 输出:10
// 修改捕获的变量
factor = 3;
Console.WriteLine(multiplier(5)); // 输出:15
7. 异步 Lambda 表达式
使用 async 和 await 关键字可以创建异步 Lambda 表达式:
csharp
Func<Task<string>> getDataAsync = async () =>
{
await Task.Delay(1000);
return "异步数据";
};
8. 表达式树
Lambda 表达式可以转换为表达式树,用于动态构建查询:
csharp
Expression<Func<int, bool>> expression = x => x > 5;
var compiled = expression.Compile();
bool result = compiled(10); // true
9. 最佳实践与注意事项
- 保持简洁:Lambda 表达式应保持简短,复杂的逻辑建议提取为独立方法
- 避免副作用:尽量编写纯函数式的 Lambda 表达式
- 注意变量捕获:理解闭包中变量捕获的时机和生命周期
- 性能考虑:频繁调用的 Lambda 表达式考虑缓存或使用静态方法
- 可读性优先:当 Lambda 表达式变得复杂时,考虑使用命名方法
10. 实际应用示例
10.1 集合操作
csharp
var persons = new List<Person>
{
new Person { Name = "Alice", Age = 25 },
new Person { Name = "Bob", Age = 30 },
new Person { Name = "Charlie", Age = 35 }
};
// 使用 Lambda 进行筛选和投影
var names = persons
.Where(p => p.Age > 25)
.Select(p => p.Name)
.ToList();
// 结果:Bob, Charlie
10.2 自定义排序
csharp
var products = new List<Product>
{
new Product { Name = "Laptop", Price = 999.99m },
new Product { Name = "Mouse", Price = 29.99m },
new Product { Name = "Keyboard", Price = 89.99m }
};
// 按价格降序排序
products.Sort((p1, p2) => p2.Price.CompareTo(p1.Price));
11. 总结
Lambda 表达式是 C# 中强大的功能特性,它通过简洁的语法提高了代码的表达能力和可读性。掌握 Lambda 表达式的各种用法,能够让你编写更加现代化和高效的 C# 代码。在实际开发中,应根据具体场景合理选择 Lambda 表达式的形式,平衡代码的简洁性和可维护性。