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.rhkb.cn/news/454773.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宣恩文旅微短剧双作开机,融合创新助力城市经济发展

近日&#xff0c;宣恩文旅微短剧《弥彰》与《新年恋爱申请&#xff0c;请通过》正式开机。这两部作品由常斌、徐子琁、常喆宽、李果、况琪儿、梅凯杰、刘书赫等实力派演员领衔主演&#xff0c;不仅汇聚了众多演艺界的佼佼者&#xff0c;更承载着宣恩县文化旅游事业的创新与发展…

【从零开始的LeetCode-算法】3075. 幸福值最大化的选择方案

给你一个长度为 n 的数组 happiness &#xff0c;以及一个 正整数 k 。 n 个孩子站成一队&#xff0c;其中第 i 个孩子的 幸福值 是 happiness[i] 。你计划组织 k 轮筛选从这 n 个孩子中选出 k 个孩子。 在每一轮选择一个孩子时&#xff0c;所有 尚未 被选中的孩子的 幸福值 …

【ELK】初始阶段

一、logstash学习 安装的时候最好不要有中文的安装路径 使用相对路径 在 Windows PowerShell 中&#xff0c;如果 logstash 可执行文件位于当前目录下&#xff0c;你需要使用相对路径来运行它。尝试输入以下命令&#xff1a; .\logstash -e ‘input { stdin { } } output { s…

Ubuntu22.04 制作系统ISO镜像

第一步&#xff1a;安装软件-Systemback 1.如果已经添加过ppa&#xff0c;可以删除重新添加或者跳过此步 sudo add-apt-repository --remove ppa:nemh/systemback 2.添加ppa 我是ubuntu20&#xff0c;但这个软件最后支持的是 ubuntu16.04版本&#xff0c;所以加一个16版本…

通过Python爬虫获取商品销量数据,轻松掌握市场动态

为什么选择Python爬虫&#xff1f; 简洁易用&#xff1a;Python语言具有简洁的语法和丰富的库&#xff0c;使得编写爬虫变得简单高效。强大的库支持&#xff1a;Python拥有强大的爬虫框架&#xff08;如Scrapy、BeautifulSoup、Requests等&#xff09;&#xff0c;可以快速实现…

算法1—八大常用排序算法(上)

1.直接插入排序 原理&#xff1a;从arr[0]开始&#xff0c;每次和后一个数据比大小&#xff0c;然后根据需要的是升序还是降序进行操作。 最差的情况下时间复杂度&#xff1a;O&#xff08;n&#xff09; 最好的情况下时间复杂度&#xff1a;O&#xff08;1&#xff09; 所…

漏洞挖掘 | 通过域混淆绕过实现账户接管

由于这是一个私有项目&#xff0c;我将使用 example.com 来代替。 很长一段时间以来&#xff0c;我一直想在漏洞赏金项目中找到一个账户接管&#xff08;ATO&#xff09;漏洞。于是&#xff0c;我开始探索项目范围内的 account.example.com。 我做的第一件事就是注册一个新账…

WebRTC音频 03 - 实时通信框架

WebRTC音频01 - 设备管理 WebRTC音频 02 - Windows平台设备管理 WebRTC音频 03 - 实时通信框架(本文) WebRTC音频 04 - 关键类 WebRTC音频 05 - 音频采集编码 一、前言&#xff1a; 前面介绍了音频设备管理&#xff0c;并且以windows平台为例子&#xff0c;介绍了ADM相关的类…

探索 Web Audio API 的奇妙世界

Web Audio API 是一项强大而灵活的 JavaScript API&#xff0c;它允许开发者在网页中处理和生成音频。本文将带您深入了解 Web Audio API 的基本概念&#xff0c;并介绍一些令人兴奋的应用场景。 1. 什么是 Web Audio API&#xff1f; Web Audio API 是一组用于处理和生成音频…

react18中在列表项中如何使用useRef来获取每项的dom对象

在react中获取dom节点都知道用ref&#xff0c;但是在一个列表循环中&#xff0c;这样做是行不通的&#xff0c;需要做进一步的数据处理。 实现效果 需求&#xff1a;点击每张图片&#xff0c;当前图片出现在可视区域。 代码实现 .box{border: 1px solid #000;list-style: …

计算机专业大学四年的学习路线(非常详细),零基础入门到精通,看这一篇就够了

前言 许多学子选择踏上计算机这条充满挑战与机遇的道路。但在大学四年中&#xff0c;如何规划自己的学习路线&#xff0c;才能在毕业时脱颖而出&#xff0c;成为行业的佼佼者呢&#xff1f; 第一学年&#xff1a;基础知识的奠基 1.1 课程安排 在大学的第一年&#xff0c;重…

elementUI进度条el-progress不显示白色

效果图 通过设置百分比为100,动态修改进度条的宽度完成 <template><div class"myProgressBox"><div class"index">{{ index }}</div><div class"typeTitle">{{ typeTitle }}</div><div class"twoP…

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第六篇-阶段总结篇】

因为马上就要进入下一个阶段&#xff0c;制作动态编辑体积纹理的模块。 但在这之前&#xff0c;要在这一章做最后一些整理。 首先&#xff0c;我们完成没完成的部分。其次&#xff0c;最后整理一下图表。最后&#xff0c;本文附上正在用的贴图 完善Shader 还记得我们之前注…

『完整代码』坐骑召唤

创建一个按钮 作为召唤/消失坐骑的开关 将预制体放入指定文件夹 命名为Mount01 创建脚本并编写&#xff1a;CallMount.cs using UnityEngine; using UnityEngine.UI; public class CallMount : MonoBehaviour{public Button callBtn;GameObject mountPrefab;GameObject mountIn…

嵌套div导致子区域margin失效问题解决

嵌套div导致子区域margin失效问题解决 现象原因解决方法 现象 <div class"prev"></div> <div class"parent"><div class"child"></div><div class"child"></div> </div> <div cl…

Netty无锁化设计之对象池实现

池化技术是比较常见的一种技术&#xff0c;在平时我们已经就接触很多了&#xff0c;比如线程池&#xff0c;数据库连接池等等。当我们要使用一个资源的时候从池中去获取&#xff0c;用完就放回池中以便其他线程可以使用&#xff0c;这样的目的就是为了减少资源开销&#xff0c;…

MySQL-23.多表查询-内连接

一.内连接 -- 多表查询 select * from tb_emp,tb_dept where tb_emp.dept_id tb_dept.id;-- 内连接 -- A.查询员工的姓名&#xff0c;及所属的部门名称&#xff08;隐式内连接实现&#xff09; select tb_emp.name as 员工姓名,tb_dept.name as 部门名称 from tb_emp,tb_dep…

简单介绍冯诺依曼体系

现代的计算机, 大多遵守冯诺依曼体系结构 CPU中央处理器&#xff1a;进行算术运算和逻辑判断。存储器&#xff1a;分为外存和内存&#xff0c;用于存储数据&#xff08;使用二进制方式存储&#xff09;。输入设备&#xff1a;用户给计算机发号施令。输出设备&#xff1a;计算机…

RISC-V笔记——Pipeline依赖

1. 前言 RISC-V的RVWMO模型主要包含了preserved program order、load value axiom、atomicity axiom、progress axiom和I/O Ordering。今天主要记录下preserved program order(保留程序顺序)中的Pipeline Dependencies(Pipeline依赖)。 2. Pipeline依赖 Pipeline依赖指的是&a…

LeetCode_2520. 统计能整除数字的位数_java

1、题目 2520. 统计能整除数字的位数https://leetcode.cn/problems/count-the-digits-that-divide-a-number/ 给你一个整数 num &#xff0c;返回 num 中能整除 num 的数位的数目。 如果满足 nums % val 0 &#xff0c;则认为整数 val 可以整除 nums 。 示例 1&#xff1a;…