【C#】lambda , lambda 表达式语法

embedded/2024/11/29 18:05:46/

Lambda 表达式是 C# 中一种非常简洁且强大的语法结构,它允许你定义匿名方法。简而言之,Lambda 表达式可以看作是一个简化的匿名方法或者匿名函数。

Lambda 表达式基础

Lambda 表达式的语法可以用于定义函数、委托、事件等,并且通常比传统的匿名方法更简洁。其基本语法形式如下:

(parameters) => expression_or_statement_block

语法分解

  • parameters:参数列表,可以为空或包含多个参数。
  • =>:Lambda 运算符,用于分隔参数和方法体。
  • expression_or_statement_block:可以是一个表达式(当 Lambda 返回值时)或者是一个语句块(当 Lambda 是一个复杂方法时)。

1. 不带参数的 Lambda 表达式

如果 Lambda 表达式不需要参数,可以省略参数列表,直接使用 () 表示。

语法
() => expression
示例
Action sayHello = () => Console.WriteLine("Hello, World!");
sayHello(); // 输出 "Hello, World!"

这里的 Action 是一个不返回值的委托类型(即返回类型是 void)。Lambda 表达式 () => Console.WriteLine("Hello, World!") 相当于一个没有参数、执行 Console.WriteLine("Hello, World!") 的方法。

2. 带参数的 Lambda 表达式

Lambda 表达式可以带有参数,参数列表类似于方法的参数列表。

语法
(parameters) => expression_or_statement_block
示例
Func<int, int, int> add = (a, b) => a + b;
int result = add(3, 4); // result = 7
Console.WriteLine(result); // 输出 7

这里,Func<int, int, int> 是一个委托类型,表示一个接受两个 int 类型参数并返回 int 类型的函数。Lambda 表达式 (a, b) => a + b 定义了一个方法,该方法接受两个参数 ab,并返回它们的和。

带有多个参数的 Lambda 表达式

Lambda 表达式可以有多个参数,多个参数之间用逗号分隔。

示例
Action<string, int> printMessage = (message, count) =>
{for (int i = 0; i < count; i++){Console.WriteLine(message);}
};
printMessage("Hello, Lambda!", 3); // 输出 "Hello, Lambda!" 三次

在这个例子中,Action<string, int> 是一个接受两个参数(一个字符串和一个整数)的委托类型。Lambda 表达式 (message, count) => { for (int i = 0; i < count; i++) { Console.WriteLine(message); } } 会输出传入的消息 count 次。

3. 带返回值的 Lambda 表达式

如果 Lambda 表达式需要返回一个值,它通常会使用单一表达式或一个语句块。

单一表达式的 Lambda 表达式

这种情况下,Lambda 表达式返回一个值,并且可以省略大括号 {}

示例
Func<int, int, int> multiply = (x, y) => x * y;
int product = multiply(5, 6); // product = 30
Console.WriteLine(product); // 输出 30

这里,Lambda 表达式 (x, y) => x * y 实现了两个整数的乘法并返回结果。

包含语句块的 Lambda 表达式

如果 Lambda 表达式的功能较为复杂,包含多个语句,则可以使用语句块 {} 来包裹。

示例
Func<int, int, int> addAndPrint = (x, y) =>
{int sum = x + y;Console.WriteLine($"The sum is: {sum}");return sum;
};
int result = addAndPrint(5, 7); // 输出 "The sum is: 12"
Console.WriteLine(result); // 输出 12

在这个例子中,Lambda 表达式 (x, y) => { int sum = x + y; Console.WriteLine($"The sum is: {sum}"); return sum; } 使用了一个语句块来计算 x + y 的和,并打印出结果,最后返回和。


4. 捕获外部变量(闭包)

Lambda 表达式能够访问其定义范围内的外部变量。这是因为 Lambda 表达式在执行时会创建一个闭包,捕获并保留外部变量的引用。

示例
int multiplier = 2;
Func<int, int> multiplyByTwo = x => x * multiplier;
Console.WriteLine(multiplyByTwo(5)); // 输出 10

在上面的例子中,Lambda 表达式访问并使用了外部变量 multiplier,这个变量的值在 Lambda 表达式定义时被捕获并保存。


5. 参数类型推断

在 Lambda 表达式中,C# 编译器通常可以自动推断参数的类型,因此你不必明确指定参数类型,除非需要明确指定。

示例
Func<int, int, int> add = (a, b) => a + b; // 类型推断

编译器推断 abint 类型,因为 Func<int, int, int> 指定了参数类型。

如果需要明确指定类型,可能会写成:

Func<int, int, int> add = (int a, int b) => a + b;

总结:Lambda 表达式语法

  1. 没有参数的 Lambda 表达式:

    () => expression
    
  2. 带一个参数的 Lambda 表达式:

    param => expression
    
  3. 带多个参数的 Lambda 表达式:

    (param1, param2, ...) => expression
    
  4. 带语句块的 Lambda 表达式:

    (param1, param2) => 
    {// multiple statementsreturn result;
    }
    
  5. 带返回值的 Lambda 表达式:

    (param1, param2) => returnValue
    

Lambda 表达式的应用场景

  • LINQ 查询:Lambda 表达式经常与 LINQ 查询一起使用,提供查询条件、排序等功能。
  • 委托和事件处理:Lambda 表达式是匿名方法的简洁替代,特别适用于事件处理、回调和异步编程等场景。
  • 集合操作:如在 List<T>.ForEachWhereSelect 等操作中使用。

Lambda 表达式极大地简化了代码,使得表达意图更加直接,减少了冗长的代码和繁杂的委托定义。


http://www.ppmy.cn/embedded/141537.html

相关文章

后端 Java发送邮件 JavaMail 模版 20241128测试可用

配置授权码 依赖 <dependency><groupId>javax.mail</groupId><artifactId>javax.mail-api</artifactId><version>1.5.5</version> </dependency> <dependency><groupId>com.sun.mail</groupId><artifa…

简单测试下faiss 检索速度

在NLP的应用中&#xff0c;经常需要用到对向量的搜索&#xff0c;如果向量的数量级非常大&#xff0c;比如1千万&#xff0c;甚至上亿条&#xff0c;普通的方式就满足不了生产需要了&#xff0c;falcebook开源的faiss框架能够解决“海量向量搜索”的问题。faiss是为稠密向量提供…

如何使用PHP爬虫获取店铺详情:一篇详尽指南

在数字化时代&#xff0c;数据的价值不言而喻。对于企业来说&#xff0c;获取竞争对手的店铺详情、顾客评价等信息对于市场分析和决策至关重要。PHP作为一种广泛使用的服务器端脚本语言&#xff0c;结合其强大的库支持&#xff0c;使得编写爬虫程序变得简单而高效。本文将详细介…

JVM_栈详解一

1、栈的存储单位 **栈中存储什么&#xff1f;**&#xff0c; 每个线程都有自己的栈&#xff0c;栈中的数据都是以栈帧&#xff08;Stack Frame&#xff09;的格式存在。在这个线程上正在执行的每个方法都各自对应一个栈帧&#xff08;Stack Frame&#xff09;。 栈帧是一个内存…

38 基于单片机的宠物喂食(ESP8266、红外、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机&#xff0c;采用L298N驱动连接P2.3和P2.4口进行电机驱动&#xff0c; 然后串口连接P3.0和P3.1模拟ESP8266&#xff0c; 红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.…

基于SpringBoot实现的民宿管理系统(代码+论文)

&#x1f389;博主介绍&#xff1a;Java领域优质创作者&#xff0c;阿里云博客专家&#xff0c;计算机毕设实战导师。专注Java项目实战、毕设定制/协助 &#x1f4e2;主要服务内容&#xff1a;选题定题、开题报告、任务书、程序开发、项目定制、论文辅导 &#x1f496;精彩专栏…

【数据库系列】Flyway详解及详细使用步骤

什么是Flyway&#xff1f; Flyway是一个开源的数据库迁移工具&#xff0c;旨在帮助开发者管理数据库版本和迁移。它支持多种数据库&#xff0c;包括MySQL、PostgreSQL、Oracle和SQL Server等。Flyway通过版本控制的方式&#xff0c;确保数据库的结构和数据与代码库中的版本保持…

AI生成一个Supermap GIS开发大赛的一个作品

2024年Supermap GIS大赛&#xff01;加油&#xff01; 参赛作品设计应充分展示SuperMap系列产品在地理信息系统&#xff08;GIS&#xff09;领域的强大功能和广泛应用。以下是一个基于SuperMap软件系列设计的参赛作品概述&#xff0c;旨在体现其数据处理、分析、制图及发布等核…