当前位置: 首页 > article >正文

C# lambda表达式的几个案例

Lambda 表达式在 C# 中用于简化匿名方法的书写形式。它广泛用于 LINQ 查询、事件处理、委托等场景。下面通过几个详细的案例展示 lambda 表达式的各种用法。

案例 1:基本的 Lambda 表达式

最基本的 Lambda 表达式通常是用于表示一个简单的函数或委托。在下面的例子中,我们定义了一个委托 Func<int, int>,并使用 Lambda 表达式为它赋值。

using System;

class Program
{
    static void Main()
    {
        // Lambda 表达式:接收一个参数 x,返回 x 的平方
        Func<int, int> square = x => x * 2;
        
        int result = square(5); // 计算 5 的平方
        Console.WriteLine(result); // 输出 10
    }
}

解释:

  • Func<int, int> 表示一个接收一个 int 参数并返回一个 int 值的委托。
  • x => x * 2 是 Lambda 表达式,其中 x 是输入参数,x * 2 是返回值。

案例 2:Lambda 表达式和 LINQ

Lambda 表达式在 LINQ 查询中非常常见。下面的例子展示如何使用 Lambda 表达式过滤并操作集合中的数据。

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

        // 使用 Lambda 表达式来筛选出所有的偶数
        IEnumerable<int> evenNumbers = numbers.Where(x => x % 2 == 0);

        Console.WriteLine("Even numbers:");
        foreach (var number in evenNumbers)
        {
            Console.WriteLine(number); // 输出 2, 4, 6, 8, 10
        }
    }
}

解释:

  • numbers.Where(x => x % 2 == 0) 使用 Lambda 表达式 x => x % 2 == 0 过滤出所有偶数。
  • x => x % 2 == 0 表示对于集合中的每一个元素 x,判断其是否为偶数,如果是,则保留该元素。

案例 3:Lambda 表达式和事件处理

Lambda 表达式也可以用作事件处理器的简写形式。通常在添加事件处理器时可以使用匿名方法或 Lambda 表达式。

using System;

class Program
{
    static void Main()
    {
        // 使用 Lambda 表达式来处理按钮点击事件
        Button button = new Button();
        button.Click += (sender, e) => Console.WriteLine("Button clicked!");
        
        // 模拟按钮点击
        button.OnClick();
    }
}

class Button
{
    public event EventHandler Click;

    public void OnClick()
    {
        // 触发事件
        Click?.Invoke(this, EventArgs.Empty);
    }
}

解释:

  • button.Click += (sender, e) => Console.WriteLine("Button clicked!"); 使用 Lambda 表达式直接添加一个事件处理器,简化了事件处理的书写。
  • 这里,Lambda 表达式 (sender, e) 对应 EventHandler 委托的参数。

案例 4:复杂的 Lambda 表达式(多参数、多行)

Lambda 表达式不仅可以用于简单的表达式,它还支持多参数和多行代码。我们可以使用花括号 {} 来定义多行 Lambda 表达式。

using System;

class Program
{
    static void Main()
    {
        // 定义一个接受两个参数的 Lambda 表达式,并包含多行代码
        Func<int, int, int> addAndMultiply = (x, y) =>
        {
            int sum = x + y;
            return sum * 2; // 返回和的两倍
        };

        int result = addAndMultiply(3, 4);
        Console.WriteLine(result); // 输出 14
    }
}

解释:

  • (x, y) => { int sum = x + y; return sum * 2; } 是一个包含多行代码的 Lambda 表达式。
  • 通过花括号,我们可以在 Lambda 表达式中编写复杂的逻辑。

案例 5:Lambda 表达式与 Action 和 Predicate

  • Action<T>:用于不返回值的委托。
  • Predicate<T>:用于返回 bool 类型的委托,通常用于条件检查。
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // 使用 Action Lambda 表达式来输出消息
        Action<string> greet = message => Console.WriteLine(message);
        greet("Hello, World!"); // 输出 Hello, World!

        // 使用 Predicate Lambda 表达式来检查数字是否为正
        Predicate<int> isPositive = x => x > 0;

        List<int> numbers = new List<int> { -1, 2, -3, 4, 5 };
        List<int> positiveNumbers = numbers.FindAll(isPositive);

        Console.WriteLine("Positive numbers:");
        foreach (var number in positiveNumbers)
        {
            Console.WriteLine(number); // 输出 2, 4, 5
        }
    }
}

解释:

  • Action<string> greet = message => Console.WriteLine(message); 使用 Lambda 表达式作为 Action 委托,用于不返回值的操作。
  • Predicate<int> isPositive = x => x > 0; 使用 Lambda 表达式作为 Predicate 委托,用于条件判断。

案例 6:Lambda 表达式与表达式树

表达式树用于将 Lambda 表达式转换为数据结构,可以在运行时分析和修改。这个功能主要用于动态 LINQ 查询。

using System;
using System.Linq.Expressions;

class Program
{
    static void Main()
    {
        // 创建一个 Lambda 表达式的表达式树
        Expression<Func<int, int>> expression = x => x * x;
        
        // 编译并执行表达式
        Func<int, int> square = expression.Compile();
        Console.WriteLine(square(5)); // 输出 25
    }
}

解释:

  • Expression<Func<int, int>> 创建了一个表达式树,而不是普通的 Lambda 表达式。
  • expression.Compile() 将表达式树编译成可执行代码。

总结

  • Lambda 表达式 是简化匿名方法的一种方式,可以在需要委托、事件处理或 LINQ 查询的地方使用。
  • 它可以用于简单的单行表达式,也可以用于复杂的多参数、多行代码
  • 在 C# 中,Lambda 表达式与 Func<>Action<>Predicate<>、事件处理和表达式树等结合使用时非常灵活强大。

这些案例展示了 Lambda 表达式在不同场景中的使用方式,让代码更简洁、直观。


http://www.kler.cn/a/320886.html

相关文章:

  • 软件测试 —— 自动化基础
  • 【GeekBand】C++设计模式笔记11_Builder_构建器
  • 《InsCode AI IDE:编程新时代的引领者》
  • mybatis的动态sql用法之排序
  • 大三学生实习面试经历(1)
  • 第二十一周机器学习笔记:动手深度学习之——数据操作、数据预处理
  • keepalived实战演练
  • Sealos 快速创建k8s 集群
  • 代码随想录算法训练营DAY09之动态规划(一)基础题目
  • 稀土功能化合物
  • HTML中的列表、表格、媒体元素和内联框架
  • 【C++习题】2.双指针_移动零
  • Rapid品牌SSL证书通配符单域名申请窍门
  • [笔记]数据结构
  • selenium模块的基本使用
  • 【Elasticsearch系列廿二】特殊参数
  • 【openwrt-21.02】openwrt PPTP Passthrough 不生效问题解决方案
  • Delphi5利用DLL实现窗体的重用
  • Vue 响应式监听 Watch 最佳实践
  • C++:STL详解(二)string类的模拟实现
  • 《python语言程序设计》2018版第8章18题几何circle2D类(下部)
  • 2024准备去面试软件测试岗,高频面试题预测?
  • yarn : 无法加载文件 C:\Users\Rog\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本
  • 深入浅出 AbstractQueuedSynchronizer (AQS)
  • SpringCloudEureka简介
  • Qt | linux+openCV+Qt6.5.3环境搭建成功版(带例子)