C#中的Lambda表达式应用方式及场景

Lambda表达式在C#中提供了一种更简洁、灵活的方式来定义匿名函数,并在多种场景下提供了更好的代码编写体验。通过使用Lambda表达式,您可以减少冗余代码,并以更直观和简洁的方式表达函数的逻辑。

当使用C#中的Lambda表达式时,有多种应用方式和应用场景。 下面我将详细介绍Lambda表达式在C#中的各种应用方式及应用场景:

  •  LINQ查询

Lambda表达式广泛用于LINQ查询。它们用于定义查询条件、排序规则和投影操作,使得查询逻辑更简洁。通过Lambda表达式,您可以直接在LINQ查询中编写逻辑,而无需显式定义匿名函数。 

// 使用Lambda表达式进行筛选
var filtered = numbers.Where(x => x % 2 == 0);

// 使用Lambda表达式进行投影
var projected = numbers.Select(x => x * 2);

// 使用Lambda表达式进行排序
var sorted = numbers.OrderBy(x => x);
  • 高阶函数 

 Lambda表达式使C#支持高阶函数,即函数接受一个或多个函数作为参数或返回一个函数。通过Lambda表达式,您可以方便地创建和传递匿名函数,以及进行函数组合和柯里化操作。

// 创建高阶函数
Func<int, Func<int, int>> curriedAdd = x => y => x + y;

// 函数组合
Func<int, int> addOne = x => x + 1;
Func<int, int> multiplyByTwo = x => x * 2;
Func<int, int> composed = addOne.Compose(multiplyByTwo);

// 柯里化
Func<int, int, int> add = (x, y) => x + y;
Func<int, Func<int, int>> curriedAdd = x => y => add(x, y);
  • 事件处理

 Lambda表达式可用于简化事件处理的代码。通过Lambda表达式,您可以直接定义事件处理程序,而无需显式编写命名方法。

button.Click += (sender, e) => Console.WriteLine("Button clicked");

// 使用条件语句的Lambda表达式
button.Click += (sender, e) =>
{
    if (e.Button == MouseButton.Left)
    {
        Console.WriteLine("Left button clicked");
    }
    else if (e.Button == MouseButton.Right)
    {
        Console.WriteLine("Right button clicked");
    }
};
  • 并行编程

Lambda表达式可用于并行编程中的任务和并行循环。通过Lambda表达式,您可以以更简洁的方式定义并行任务和循环体。 

// 并行任务
Task.Run(() => DoSomethingAsync());

// 并行循环
Parallel.For(0, 10, i => Console.WriteLine(i));

Parallel.ForEach(numbers, n => Console.WriteLine(n));
  •  委托和事件

Lambda表达式可以用作委托类型的实例,以便传递给其他方法或在事件中使用。 

Action<int> printNumber = x => Console.WriteLine(x);

Func<int, int, int> sum = (x, y) => x + y;

EventHandler clickHandler = (sender, e) => Console.WriteLine("Clicked");

  •  异步 lambda

在C#中,异步Lambda表达式可以与异步方法(使用async关键字修饰的方法)一起使用,以便在异步操作中执行相应的逻辑。通过将async修饰符与Lambda表达式结合使用,您可以在表达式中使用异步操作、异步等待和异步返回。 

// 异步Lambda表达式示例
Func<int, Task<int>> asyncAdd = async x =>
{
    await Task.Delay(1000);  // 模拟异步操作
    return x + 1;
};

// 在异步方法中调用异步Lambda表达式
async Task RunAsyncLambda()
{
    int result = await asyncAdd(2);
    Console.WriteLine(result);
}

// 调用异步方法
RunAsyncLambda().Wait();

异步Lambda表达式常用于需要在异步上下文中执行逻辑的场景,如使用异步LINQ查询、异步事件处理、异步任务和异步循环等。通过使用异步Lambda表达式,您可以更方便地编写和管理异步操作,以及处理异步代码的结果。 

------------------------------ 

从 C# 10 开始,Lambda 表达式可能具有自然类型。 编译器不会强制你为 Lambda 表达式声明委托类型(例如 Func<...> 或 Action<...>),而是根据 Lambda 表达式推断委托类型 

// 自然类型的Lambda表达式示例
int[] numbers = { 1, 2, 3, 4, 5 };

// 无需显式声明委托类型
var evenNumbers = numbers.Where(n => n % 2 == 0);

// 输出结果
foreach (var number in evenNumbers)
{
    Console.WriteLine(number);
}

以下是C#中使用Lambda表达式的一些示例: 

// 使用Lambda表达式定义一个简单的加法函数
Func<int, int, int> add = (x, y) => x + y;

// 调用Lambda函数
int result = add(2, 3);
Console.WriteLine(result);  // 输出:5

// 将Lambda表达式作为参数传递给高阶函数
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
List<int> squared = numbers.Select(x => x * x).ToList();
Console.WriteLine(string.Join(", ", squared));  // 输出:1, 4, 9, 16, 25

猜你喜欢

转载自blog.csdn.net/book_dw5189/article/details/131504578
今日推荐