Lambda表达式 #
一、Lambda概述 #
1.1 什么是Lambda #
Lambda表达式是创建匿名函数的简洁语法。
1.2 Lambda特点 #
- 语法简洁
- 类型推断
- 支持闭包
- 可转表达式树
二、Lambda语法 #
2.1 基本语法 #
csharp
Func<int, int> square = x => x * x;
Func<int, int, int> add = (x, y) => x + y;
Action<string> print = s => Console.WriteLine(s);
Func<int, bool> isPositive = x => x > 0;
Predicate<int> isEven = x => x % 2 == 0;
2.2 参数形式 #
csharp
Func<int> noParam = () => 42;
Func<int, int> oneParam = x => x * 2;
Func<int, int, int> twoParams = (x, y) => x + y;
Func<int, int, int, int> threeParams = (x, y, z) => x + y + z;
Func<int, int, int> explicitType = (int x, int y) => x + y;
2.3 语句Lambda #
csharp
Action<string> print = s =>
{
Console.WriteLine($"处理: {s}");
Console.WriteLine($"长度: {s.Length}");
};
Func<int, int, int> calculate = (x, y) =>
{
int result = x + y;
return result;
};
三、捕获变量 #
3.1 闭包 #
csharp
int factor = 10;
Func<int, int> multiply = x => x * factor;
Console.WriteLine(multiply(5));
factor = 20;
Console.WriteLine(multiply(5));
3.2 循环变量 #
csharp
var actions = new List<Action>();
for (int i = 0; i < 3; i++)
{
int captured = i;
actions.Add(() => Console.WriteLine(captured));
}
foreach (var action in actions)
{
action();
}
3.3 捕获this #
csharp
public class Calculator
{
private int _factor = 10;
public Func<int, int> GetMultiplier()
{
return x => x * _factor;
}
}
四、表达式树 #
4.1 Expression #
csharp
Expression<Func<int, int>> expr = x => x * x;
Func<int, int> func = expr.Compile();
int result = func(5);
Console.WriteLine(expr);
4.2 分析表达式树 #
csharp
Expression<Func<int, int, int>> expr = (x, y) => x + y;
var visitor = new ExpressionVisitor();
visitor.Visit(expr);
ParameterExpression param1 = expr.Parameters[0];
ParameterExpression param2 = expr.Parameters[1];
BinaryExpression body = (BinaryExpression)expr.Body;
Console.WriteLine($"左边: {body.Left}");
Console.WriteLine($"右边: {body.Right}");
Console.WriteLine($"操作: {body.NodeType}");
4.3 构建表达式树 #
csharp
ParameterExpression param = Expression.Parameter(typeof(int), "x");
ConstantExpression constant = Expression.Constant(2);
BinaryExpression multiply = Expression.Multiply(param, constant);
Expression<Func<int, int>> expr = Expression.Lambda<Func<int, int>>(multiply, param);
Func<int, int> func = expr.Compile();
int result = func(5);
五、内置委托 #
5.1 Action #
csharp
Action action = () => Console.WriteLine("Hello");
Action<int> print = x => Console.WriteLine(x);
Action<int, string> process = (x, s) => Console.WriteLine($"{x}: {s}");
5.2 Func #
csharp
Func<int> getNumber = () => 42;
Func<int, int> square = x => x * x;
Func<int, int, int> add = (x, y) => x + y;
5.3 Predicate #
csharp
Predicate<int> isEven = x => x % 2 == 0;
Predicate<string> isLong = s => s.Length > 10;
六、LINQ中的Lambda #
6.1 Where #
csharp
var numbers = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var evens = numbers.Where(x => x % 2 == 0);
var greaterThan5 = numbers.Where(x => x > 5);
6.2 Select #
csharp
var numbers = new[] { 1, 2, 3, 4, 5 };
var squared = numbers.Select(x => x * x);
var strings = numbers.Select(x => x.ToString());
6.3 OrderBy #
csharp
var people = new[] { new { Name = "张三", Age = 25 }, new { Name = "李四", Age = 20 } };
var sorted = people.OrderBy(p => p.Age);
var desc = people.OrderByDescending(p => p.Name);
七、实战示例 #
7.1 过滤器 #
csharp
public static List<T> Filter<T>(IEnumerable<T> items, Func<T, bool> predicate)
{
return items.Where(predicate).ToList();
}
var numbers = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var evens = Filter(numbers, x => x % 2 == 0);
var greaterThan5 = Filter(numbers, x => x > 5);
7.2 转换器 #
csharp
public static List<TResult> Map<TSource, TResult>(
IEnumerable<TSource> items,
Func<TSource, TResult> selector)
{
return items.Select(selector).ToList();
}
var numbers = new[] { 1, 2, 3, 4, 5 };
var squared = Map(numbers, x => x * x);
var strings = Map(numbers, x => x.ToString());
八、总结 #
Lambda要点:
| 要点 | 说明 |
|---|---|
| => | Lambda运算符 |
| 参数 | 显式或隐式类型 |
| 闭包 | 捕获外部变量 |
| Expression | 表达式树 |
下一步,让我们学习反射与特性!
最后更新:2026-03-26