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