C# Lambda 表达式:从入门到精通

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 表达式的形式,平衡代码的简洁性和可维护性。

相关推荐
AI导出鸭PC端2 小时前
Perplexity批量导出没有PDF模式?AI导出鸭插件补上最后一块拼图
人工智能·pdf·c#·ai导出鸭
Risehuxyc3 小时前
C# 选用更流行的语言版本
c#
淡海水1 天前
09-04-内存-Unity原生对象生命周期
unity·c#·游戏引擎·gc
吴可可1231 天前
富怡CAD二次开发指南
c#
1-1=01 天前
C# IO和序列化
c#·.net·.netcore
寂寞的船1 天前
【Unity Bug挑战】第10期 SerializeReference 内存泄漏之谜
unity·c#·游戏引擎·bug
CSharp精选营1 天前
从控制台到「会动手」的 AI:用 Semantic Kernel 搭应用(小白教程)
c#·.net·ai agent·semantickernel·functioncalling
宝桥南山2 天前
.NET 11 - 尝试一下Blazor中的新特性SupplyParameterFromTempData
microsoft·微软·c#·asp.net·.net·.netcore
1-1=02 天前
C# 中 Lambda、Linq 与 Expression
c#·linq
zhanghaha13142 天前
C# 系列教程_7 判断语句(分支)保姆级精讲
开发语言·c#