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

C# lambda表达式语法简介

Lambda 表达式是 C# 中的一种简洁的语法,用于创建匿名函数或表达式。它让你可以编写简洁而强大的代码,用于处理集合、事件、线程等场景。Lambda 表达式广泛用于 LINQ 查询和委托,简化了操作代码。

一、Lambda 表达式的基本语法

Lambda 表达式使用 => 符号分隔参数列表和表达式或代码块,称为“lambda 运算符”。其基本语法格式如下:

(parameters) => expression

(parameters) => { statements }
  • parameters 是参数列表,可以有零个、一个或多个参数。如果只有一个参数,括号可以省略。
  • expression 是表达式的主体,通常是一个单行语句,返回值会自动推断。
  • { statements } 是多行语句的主体,可以包含多个代码行,并需要明确使用 return 语句返回值。

二、示例演示

以下是一些简单的 Lambda 表达式示例:

  1. 无参数的 Lambda 表达式

    // 无参数的 Lambda 表达式
    Action greet = () => Console.WriteLine("Hello, world!");
    greet(); // 输出:Hello, world!
    
  2. 一个参数的 Lambda 表达式

    // 计算一个数的平方
    Func<int, int> square = x => x * x;
    int result = square(5); // result = 25
    Console.WriteLine(result);
    
  3. 多个参数的 Lambda 表达式

    // 两个数相加
    Func<int, int, int> add = (x, y) => x + y;
    int sum = add(3, 4); // sum = 7
    Console.WriteLine(sum);
    
  4. 带代码块的 Lambda 表达式

    // 带有多行代码块的 Lambda 表达式
    Func<int, int, int> max = (a, b) =>
    {if (a > b)return a;elsereturn b;
    };
    int largerNumber = max(10, 20); // largerNumber = 20
    Console.WriteLine(largerNumber);
    

三、Lambda 表达式与委托的关系

Lambda 表达式通常用来创建委托或表达式树。委托是一种类型安全的函数指针,用于引用方法。Lambda 表达式可以直接赋值给委托。

例如:

// 定义一个委托类型
delegate int Operation(int x, int y);// 使用 Lambda 表达式来创建委托实例
Operation multiply = (x, y) => x * y;
int product = multiply(3, 4); // product = 12
Console.WriteLine(product);

四、Lambda 表达式在 LINQ 中的应用

LINQ(Language Integrated Query)是 C# 提供的一种查询语法,可以与 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 表达式筛选出偶数,并按降序排序var evenNumbers = numbers.Where(n => n % 2 == 0).OrderByDescending(n => n);foreach (var number in evenNumbers){Console.WriteLine(number); // 输出:10 8 6 4 2}}
}

在上面的例子中,Where 方法用于筛选偶数,OrderByDescending 方法用于按降序排序。这些方法都接受 Lambda 表达式作为参数。

五、捕获外部变量

Lambda 表达式可以捕获外部变量,并在表达式的生命周期内保留它们的状态。这被称为“闭包”。

int factor = 3;
Func<int, int> multiply = n => n * factor;Console.WriteLine(multiply(5)); // 输出:15
factor = 5;
Console.WriteLine(multiply(5)); // 输出:25

在这个例子中,Lambda 表达式捕获了外部变量 factor,并随着 factor 的变化而变化。

六、表达式树

表达式树是 Lambda 表达式的一种特殊用法。它允许你将代码表示为数据结构,可以在运行时动态生成和执行代码。表达式树主要用于 LINQ to SQL、Entity Framework 等框架中,将查询转换为 SQL 查询语句。

using System;
using System.Linq.Expressions;class Program
{static void Main(){// 创建表达式树Expression<Func<int, int>> expression = x => x * 2;// 分析表达式树的结构Console.WriteLine($"表达式类型: {expression.NodeType}");Console.WriteLine($"表达式体: {expression.Body}");Console.WriteLine($"参数: {expression.Parameters[0].Name}");}
}

在这个例子中,expression 是一个表达式树,它描述了一个简单的数学运算(将输入乘以 2)。可以对表达式树进行分析、修改和动态编译。

七、Lambda 表达式与匿名方法的比较

Lambda 表达式和匿名方法类似,都是用来定义内联函数的,但 Lambda 表达式更简洁。下面是它们的对比:

// 匿名方法
Func<int, int> square1 = delegate (int x) { return x * x; };// Lambda 表达式
Func<int, int> square2 = x => x * x;

Lambda 表达式更简洁,同时还支持捕获外部变量、更好的类型推断等功能。

八、常用的 Lambda 表达式方法

  • Where:筛选集合中的元素。
  • Select:投影集合中的元素到新的形式。
  • OrderBy / OrderByDescending:按指定字段升序或降序排序。
  • GroupBy:对集合中的元素进行分组。
  • Any / All:判断集合中是否有任何或全部元素满足条件。
  • First / FirstOrDefault:获取集合中第一个或符合条件的第一个元素。
  • Sum / Average / Max / Min:对集合中的数值进行汇总。

例如,统计列表中所有偶数的和:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int evenSum = numbers.Where(n => n % 2 == 0).Sum();
Console.WriteLine(evenSum); // 输出:30

九、总结

  1. Lambda 表达式是 C# 中定义匿名函数的简洁语法,使代码更具可读性和简洁性。
  2. Lambda 表达式广泛应用于 LINQ 查询、委托、事件处理和异步编程
  3. 表达式树允许程序动态创建和执行代码,是构建复杂查询和框架的基础。
  4. **捕获外部变量(闭包)**使 Lambda 表达式更为灵活。

通过 Lambda 表达式,C# 提供了一种强大的、简洁的函数式编程风格,大大简化了对数据的处理操作。


http://www.mrgr.cn/news/56100.html

相关文章:

  • 浏览器控制的无线开关
  • 嵌入式入门学习——6Protues点亮数码管,认识位码和段码,分辨共阴还是共阳(数字时钟第一步)
  • 毕业设计—基于 Inception-ResNet模型的皮肤癌分类系统实现
  • 天锐绿盾 vs Ping32:企业级加密软件大比拼
  • 《嵌入式最全面试题-Offer直通车》目录
  • 学习eNSP对提升就业竞争力有多大帮助?
  • Python Numpy 实现神经网络自动训练:反向传播与激活函数的应用详解
  • 【Linux】进程优先级进程切换
  • centos7 使用yum卸载redis3.2版本并安装redis5版本
  • 后端:唯一ID有哪些生成方式
  • 有趣的css - 拉链式展开按钮
  • 天锐绿盾 vs Ping32:企业级加密软件大比拼
  • 数据库的CURD【MySql】
  • 基于Java语言的智慧社区-智慧社区解决方案
  • C++ —— set系列的使用
  • CMake的使用(二)
  • 功能驱动方法是什么?如何有效管理技术债务以避免项目风险?
  • 【meshlab学习篇之前置】最详细清晰的meshlab环境配置(Windows)
  • 8000万!海淀!海新智能搭建AI产品生态,这样服务“一老一小”与“无障碍”群体
  • 2024网站建设公司哪家好
  • 大学生项目竞赛:如何通过面试选拔优秀队友
  • 【C语言】自定义类型------枚举类型
  • win11环境下成功安装mamba
  • vscode ai代码补全插件 tab键接受失效
  • 上传代码到云效
  • QT界面开发--我的第一个windows窗体【菜单栏、工具栏、状态栏、铆接部件、文本编辑器、按钮、主界面】