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

相关推荐
zlinear数据采集卡6 小时前
D223 ADC数据处理流水线:从原始采样值到工程单位的完整转换链
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
花落人散处9 小时前
CDiskClean 开发历程 —— 文件清理_目录树解析实现方案参考
c#
离陌在学C#10 小时前
C# 泛型:从基础到高级应用
开发语言·c#
Vertira10 小时前
C# 与 OpencvSharp 编程[基础目录]
c#
格林威12 小时前
多相机并行采图最佳实践:Task.WhenAll + 异常处理 + 资源释放
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·机器视觉
yuhulkjv33520 小时前
Claude表格复制到word不再崩溃,AI导出鸭批量导出+格式无损一键搞定
人工智能·ai·c#·word·ai导出鸭
arbboter1 天前
【网络工具】NetProxy网络代理用户手册
开发语言·网络·c#·网络代理·网络异常·代理工具
微小冷1 天前
海康威视相机C#二次开发环境配置
数码相机·c#·.net·海康威视·相机开发
吴可可1231 天前
C#重写机制与CAD图元开发要点
c#
A_nanda1 天前
c#WPF开发常见问题
开发语言·c#·wpf