C# 的 Lambda 表达式是一种强大的语法糖,能够极大简化代码并增强灵活性。以下是它的主要功能和应用场景,结合具体示例说明:
Lambda 可以快速定义委托(如 Func、Action),无需显式声明方法。
// 传统委托(需要单独定义方法)
Func<int, int> square1 = Square; // 假设有方法 int Square(int x) { return x*x; }
// Lambda 表达式
Func<int, int> square2 = x => x * x;
Console.WriteLine(square2(5)); // 输出 25
Lambda 是 LINQ 查询的核心,用于过滤、映射、排序等操作。
List<int> numbers = new List<int> { 1, 3, 5, 2, 4 };
// 过滤偶数并排序
var evenNumbers = numbers.Where(n => n % 2 == 0).OrderBy(n => n);
// 输出 2, 4
// 将集合映射为字符串
var squaredStrings = numbers.Select(x => $"Squared: {x * x}");
// 输出 ["Squared: 1", "Squared: 9", ...]
简化事件订阅或异步回调的代码。
// 按钮点击事件
button.Click += (sender, e) => Console.WriteLine("按钮被点击!");
// 异步操作回调
Task.Run(() => SomeLongTask())
.ContinueWith(task => Console.WriteLine("任务完成!"));
Lambda 可以访问并修改定义在其外部的变量。
int factor = 2;
Func<int, int> multiplier = x => x * factor;
Console.WriteLine(multiplier(5)); // 输出 10
factor = 3;
Console.WriteLine(multiplier(5)); // 输出 15(捕获最新值)
将 Lambda 转换为表达式树,用于动态生成代码(如 ORM 框架的查询转换)。
// 将 Lambda 转换为表达式树(而非直接编译为委托)
Expression<Func<int, int, int>> expr = (a, b) => a * b + 2;
// 动态编译并执行表达式
var compiledExpr = expr.Compile();
Console.WriteLine(compiledExpr(3, 4)); // 输出 14 (3*4 + 2)
Lambda 支持异步操作,简化异步方法的定义。
// 异步 Lambda 执行 HTTP 请求
Func<Task<string>> fetchData = async () => {
using var client = new HttpClient();
return await client.GetStringAsync("https://example.com");
};
// 调用异步 Lambda
var data = await fetchData();
将 Lambda 作为高阶函数的参数,实现灵活的逻辑注入。
// 自定义排序规则
List<string> words = new List<string> { "apple", "banana", "cherry" };
words.Sort((a, b) => a.Length.CompareTo(b.Length));
// 按单词长度排序:["apple", "cherry", "banana"]
// 条件过滤工厂
Func<int, bool> CreateFilter(int threshold) => x => x > threshold;
var filter = CreateFilter(10);
Console.WriteLine(filter(15)); // 输出 true
Lambda 可以封装逻辑,延迟到需要时执行。
// 延迟计算值
Lazy<int> lazyValue = new Lazy<int>(() => {
Console.WriteLine("计算中...");
return 42;
});
Console.WriteLine(lazyValue.Value); // 第一次访问时执行 Lambda
结合反射和表达式树,动态生成高性能代码。
// 动态创建一个加法方法
var paramA = Expression.Parameter(typeof(int), "a");
var paramB = Expression.Parameter(typeof(int), "b");
var addBody = Expression.Add(paramA, paramB);
var lambda = Expression.Lambda<Func<int, int, int>>(addBody, paramA, paramB);
var addFunc = lambda.Compile();
Console.WriteLine(addFunc(3, 4)); // 输出 7
自动推断泛型类型参数,简化泛型代码。
T Process<T>(T input, Func<T, T> transformer) => transformer(input);
// 自动推断 T 为 int
var result = Process(10, x => x * 2); // 输出 20