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

相关推荐
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
神仙别闹4 天前
基于C#+MySQL实现(WinForm)个人聊天室软件
c#
kybs19914 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
Polevne5 天前
C# SFTP客户端实现文件传输
c#·ssh
samble5 天前
从零搭建灌装监控系统(四):深色主题与样式系统,ResourceDictionary 统一管理
c#·wpf·mvvm·样式·工业控制
cjp5605 天前
024 . WPF MVVM类封装优化
c#
淡海水5 天前
13-04-面试-源码级深度追问链
数据结构·unity·面试·c#·游戏引擎·源码·il2cpp
asdzx675 天前
如何使用 C# 提取 PPT 文本与图片
c#·ppt·提取文本
2501_930707785 天前
使用C#代码使用条件格式为 Excel 隔行设置颜色
c#·excel
何以解忧唯有撸码5 天前
【开源】c#造个轮子-日程安排工具
c#·自定义控件