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

相关推荐
点心的游戏开发世界6 小时前
Unity C# 脚本学习笔记:命名空间与 using
学习·unity·c#
淡海水8 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
点心的游戏开发世界8 小时前
Unity C# 脚本学习笔记:泛型
学习·unity·c#
公子小六12 小时前
基于.NET的Windows窗体编程之WinForms滑块与上下控件
windows·microsoft·c#·.net·winforms
曹牧13 小时前
C#:文本文件读取
服务器·前端·c#
2601_9673387113 小时前
C#上位机开发零基础入门到精通全套视频
开发语言·c#
czhc114007566318 小时前
2026-09-03 博客:配置与密码 · 合并代码 · 超时排查
c#
格林威20 小时前
C#图像夜间识别率提升:使用OpenCvSharp和Halcon融合DeepSORT实现复杂场景下准确识别
开发语言·人工智能·数码相机·机器学习·计算机视觉·c#·视觉检测
曹牧1 天前
C#:线程间操作无效,不是从创建控件线程访问
开发语言·c#
anlog1 天前
ini文件读取,EXE同目录文件读取
c#·ini