C# Lambda表达式各种用法总结

Lambda表达式详解(C#) Lambda表达式可以采用以下任意一种形式的表达式: 1.表达式Lambda,表达式为其主体: (input-parameters) => expression 2.语句Lambda,语句块作为其主体: (input-parameters) => {<sequence-of-statements>} 使用Lambda声明运算符=>,从其主体中分离Lambda参数列表。若要创建Lambda表达式,需要在Lambda运算符左侧指定输入参数(如果有参数时),然后在另一侧输入表达式 阅读详情

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


此总结是参考C#图解教程总结而来的,仅供参考

前言

C# Lambda 作用

Lambda表达式可用于简化C#中委托的匿名语法


我们通过使用Lambda表达式前后委托的语法做比较

一、使用Lambda 之前的示例

此示例为委托的匿名方法声明不带Lambda表达式


namespace ConsoleApp3
{
    class Program
    {
    	//委托字段--带输入参数X
        public delegate void CountAdd(int x);
        static void Main(string[] args)
        {
            int y = 2;
            //委托的匿名声明--注意在delegate后面添加参数X 
            CountAdd CountAdd1 = delegate (int x)
            {
                x += 1;
                Console.WriteLine("Before add the y value is  {0}", y);
                Console.WriteLine("the add value is {0}", x);
            };
            CountAdd1(y);
        }
    }
}

以上代码输出内容为:
Before add the y value is 2
the add value is 3

二、使用Lambda 之后的示例

namespace ConsoleApp3
{
    class Program
    {
        public delegate void CountAdd(int x);
        static void Main(string[] args)
        {
            int y = 2;
            //此处为未使用Lambda表达式的语法
            CountAdd CountAdd1 = delegate (int x)
            {
                x += 1;
                Console.WriteLine("Before add the y value is  {0}", y);
                Console.WriteLine("the add value is {0}", x);
            };
            //CountAdd1(y);
			//此处为使用了Lambda表达式的语法, 在此语法中将声明的关键字delegate取消并在参数之后添加=>Lambda符号
            CountAdd CountAdd2 = (int x) =>
            {
                x += 1;
                Console.WriteLine("Before add the y value is  {0}", y);
                Console.WriteLine("the add value is {0}", x);
            };
            CountAdd2(y);
        }
    }
}

以上代码输出内容为:
Before add the y value is 2
the add value is 3

然而Lambda可以将表达式更精简…

在以上Lambda示例中我们利用Lambda表达式简化了原有的"delegate"关键字,并添加了=>字符,这似乎并没有什么太大的变化,实际上我们可以进一步简化,在以下2个方面进行

  1. 简化其输入参数将其显示类型变为隐式类型
    • 带有类型的参数列表称为显式类型
    • 省略类型的参数列表称为隐式类型
    • 注意如果在Lambda表达式中有ref或out类型则必须注明参数类型
  2. 在只有一个隐式类型输入参数的情况下可以将输送参数两边的圆括号省略
  3. 简化代码块两边的中括号最后,Lambda 表达式允许表达式的主体是语句块或表达式,如果 语句 块包含了一个返回语句,我们可以将语句块替换为return关键字后的表达式

来看示例:

namespace ConsoleApp3
{
    class Program
    {
        public delegate void CountAdd(int x);
        static void Main(string[] args)
        {
            int y = 2;
            //不带Lambda 表达式的委托匿名语法声明
            CountAdd CountAdd1 = delegate (int x)
            {
                x += 1;
                Console.WriteLine("Before add the y value is  {0}", y);
                Console.WriteLine("the add value is {0}", x);
            };
            //CountAdd1(y);
            //简化了"delegate"的Lambda表达式声明
            CountAdd CountAdd2 = (int x) =>
            {
                x += 1;
                Console.WriteLine("Before add the y value is  {0}", y);
                Console.WriteLine("the add value is {0}", x);
            };
            //CountAdd2(y);
            //简化了输入参数及其两边括号的Lambda表达式声明
            CountAdd CountAdd3 = x =>
            {
                x += 1;
                Console.WriteLine("Before add the y value is  {0}", y);
                Console.WriteLine("the add value is {0}", x);
            };
            CountAdd3(y);
        }
    }
}

以上代码输出内容为:
Before add the y value is 2
the add value is 3

另外两种Lambda表达式简化语法

  1. 当Lambda表达式只有一个表达式时其两边的中括号可以省略

看下面的示例:

namespace ConsoleApp3
{
    class Program
    {
        public delegate void CountAdd(int x);
        static void Main(string[] args)
        {
            int y = 2;
            CountAdd CountAdd3 = x =>
            {
                x += 1;
                Console.WriteLine("Before add the y value is  {0}", y);
                Console.WriteLine("the add value is {0}", x);
            };
			//当CountAdd4的Lambda表达式只包含一个表达式时其两边的中括号可以省略掉  
			//CountAdd CountAdd4 = x =>{CountAdd3(x);};
            CountAdd CountAdd4 = x => CountAdd3(x);
            CountAdd4(y);
        }
    }
}

以上代码输出内容为:
Before add the y value is 2
the add value is 3

  1. 当Lambda表达式中包含一个返回语句时,可以将其替换为return后的语句

看下面的示例:

namespace ConsoleApp3
{
    class Program
    {
        public delegate int CountAddReturn(int x);
        static void Main(string[] args)
        {
            int y = 2;
            //当Lambda语句中只有一个Return语句时可将其替换成Return后的内容
            //CountAddReturn CountAdd5 = x => { return x + 1; };
            CountAddReturn CountAdd5 = x =>  x + 1;
            Console.WriteLine("The CountAdd5 return value is  {0}", CountAdd5(y)); 
        }
    }
}

以上代码输出内容为:
The CountAdd5 return value is 3


三、WPF 中标题为按钮添加异步方法

新建WPF项目并添加如下XAML程序

<Window x:Class="WpfApp_Lamda.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp_Lamda"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel>
        <TextBlock Name="workStartedTextBlock" Margin=" 10, 10"/>
        <Button Name="startWorkButton" Width=" 100" Margin=" 4" Content=" Start Work" />
    </StackPanel>

</Window>

在cs程序中利用async/await特性为按钮添加如下程序,实现当点击按钮后触发的事件在异步执行,主线程的操作如调整窗口大小及移动仍能正常执行,否则在没有异步的情况下主线程会等待4s的时间才能响应用户操作,这显然是不能接受的。

namespace WpfApp_Lamda
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            //Lamda 异步方法声明委托
            startWorkButton.Click += async (sender,e) =>
                {
                    SetGuiValues(false, "Work Started");
                    await DoSomeWork();
                    SetGuiValues(true, "Work Finished");

                };

           
        }
        private void SetGuiValues(bool buttonEnabled, string status)
        {
            startWorkButton.IsEnabled = buttonEnabled;
            workStartedTextBlock.Text = status;
        }
        private Task DoSomeWork()
        {
            return Task.Delay(4000);
        }
    }
}

总结

  1. Lambda表达式是对匿名语法的简化可供了解,在阅读代码时可识别语句
  2. Lambda表达式声明仍需要保持与委托的声明参数数量、类型及位置上保持一致
  3. Lambda表达式中如果只有一个参数并且可声明为隐式类型的情况下其两边的圆括号可以省略
  4. Lambda表达式中如果语句中只有一个表达式时可以省略其两边的大括号
  5. Lambad表达式中如果没有参数则圆括号不能省略
C#深度解析:Lambda表达式与Func/Action委托的全方位指南 Lambda表达式是C#中用于定义匿名函数的一种简洁语法。它允许您在代码中直接内联编写小型、临时的函数,而无需显式定义一个完整的独立方法。Lambda表达式的语法由三个部分组成:输入参数列表、箭头符号=>以及表达式或语句块。Lambda表达式的基本结构Csharp:可选,表示Lambda接受的参数。可以是一个参数,多个参数(用逗号分隔),或没有参数(此时为空括号()=>:箭头符号,将参数列表与Lambda体分开。 阅读详情

相关推荐

C# Lambda 表达式:从基础用法到集合操作实战

Lambda 核心规则:单参数可省括号,单行有返回值可省{}和return,编译器自动推断参数类型;核心场景:无返回值(Action)用于“执行操作”,有返回值(Func)用于“计算/查询”;EF 关键要点:Lambda 会被解析为 SQL,需使用 EF 支持的方法,加ToList()等方法才执行查询;避坑核心:委托类型匹配、多行有返回值加return、优先用避免异常。掌握这些规则和示例,你就能在 C# 集合操作、EF 数据查询中灵活使用 Lambda,大幅简化代码并提升开发效率!👋 关注我!

bugcome的博客 936

C# Lambda表达式

Lambda表达式是C#语言中一种函数式编程的特性,它的主要作用是简化代码和提高代码的可读性。在使用Lambda表达式时,可以通过其内联特性来实现编写更加简洁的代码。下面将分别介绍Lambda表达式的语法和内联特性。Lambda表达式是一种匿名函数,它可以快速创建简单的委托或表达式树。在C#中,Lambda表达式通常用于替代匿名方法。Lambda表达式通常以箭头“=>”分隔左侧的输入和右侧的输出。

無限進步的全棧遊戲開發的博客 8631

C#基础之Lambda表达式用法实例教程

主要介绍了C#中Lambda表达式用法,并与之前所述的匿名方法做一比较,详细的讲述了Lambda表达式的定义及具体用法,需要的朋友可以参考下

C#扩展方法与Lambda表达式基本用法

​​扩展方法​​允许为现有类型"添加"方法,而无需修改原始类型或创建派生类型。​​

让每一个想学习编程的人,都能学会,都能看懂,看了都有收获! 1595

VS2103+Intel2013+MSMPI运行Fortran并行程序

VS2103+Intel2013+MSMPI运行Fortran并行程序MSMPI安装新建Fortran90项目编写Fortran并行程序在cmd运行编译完成的执行文件 MSMPI安装 我这里采用的是Microsoft MPI v9.0.1,可以点此下载。下载完成后同时安装msmpisdk.msi、msmpisetup.exe两个文件,安装位置默认即可。 其中msmpisdk.msi的默认安装路径在C:\Program Files (x86)\Microsoft SDKs\MPI,该文件包含了mpi环境所需

weixin_43176703的博客 2937

不只是CPU主频:深入解析英飞凌Aurix TC3xx各外设时钟树(CAN、以太网、Flash时序如何配置)

本文深入解析英飞凌Aurix TC3xx系列微控制器的外设时钟树配置,涵盖CAN、以太网和Flash时序的优化方法。通过详细分析时钟系统架构、关键外设配置及多外设协同设计策略,帮助工程师实现高性能汽车电子控制单元(ECU)开发。特别关注系统时钟的灵活配置与EMC优化技巧,提升系统实时性和可靠性。

weixin_29189373的博客 401

C#中Func的用法和Lambda表达式

  https://www.cnblogs.com/suanshun/p/5549063.html   在C#3.0中引用了Limbda表达式,Limbda表达式实际上就是一个方法,只不过该方法是匿名方法(即没有名称的方法) 代码片段: Func&lt;int,string,string&gt; t=(int x, string b) =&gt; (x.ToString() + b);就等于...

zunguitiancheng的专栏 2686

变焦跟踪理论基础(如何在变焦过程中保持清晰)

如何在整个变焦过程中一直保持图像的清晰度或焦点是变焦跟踪的主要挑战。 当用户在缩放跟踪的情况下改变缩放时,设备保持对焦。 然而,在没有变焦跟踪的情况下,图像变得失焦,图像在变焦跟踪后由于自动对焦(AF)算法才最终对焦。...................................................

ChenYX的博客 20万+

C#中Lambda表达式的用法

本经验介绍C#语言中Lambda表达式的用法,Lambda表达式是为了简化C#的代码而出现的,下面将通过对比Lambda表达式出现前后对C#源代码的影响,来讲解Lambda表达式的用法。 工具/原料 Visual Studio 2013 方法/步骤 1 Lambda表达式出现之前,计算两个int类型变量的和,需要定义一个Add方法,在Main函数中,调用Add方法,传入两个参数,并接受返回结果。(为了方便讲解,我用到了Func委托) 如下图: 2 输出的结果就是30

xujianjun229的博客 793

NXP KW45开发实战:如何在MCUXpresso IDE中正确配置J-Link并解决设备识别问题

本文详细介绍了在MCUXpresso IDE中配置J-Link以支持NXP KW45无线MCU开发的实战指南。从环境准备到J-Link深度配置,再到烧录流程优化和高级调试技巧,帮助开发者高效解决设备识别问题并提升开发效率。特别推荐使用JLinkRemoteServer.exe进行多设备并行调试,并提供了烧录速度优化和低功耗调试的实用技巧。

gray5的博客 864

解决:请求的资源[/xxx/]不可用 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。

解决:请求的资源[/xxx/]不可用 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。

念兮为美 1万+

c# Lambda 表达式的用法、规范 为新手节省宝贵的时间,避免采坑!

本文简明介绍了Lambda表达式的基本用法和规范,帮助新手快速掌握这一编程技巧。Lambda表达式是一种匿名函数,通过=>运算符连接输入参数和表达式/语句块,常用于简化代码、委托和回调。文章从参数传递、空返回值、表达式语句等角度讲解Lambda用法,并提供了两个实际示例(包括数值计算和动态添加事件监听)。特别强调Lambda可以访问外部变量,能替代匿名函数,大幅提升代码简洁性。最后指出这是开发者必备技能,帮助读者避免常见错误。

写着玩儿的博客 353

【肝帝一周总结:全网最全最细】十万字python教程,学不会找我!教到你会为止!!内容超多,建议收藏慢慢看!

文章目录前言一定要看python入门python缩进Python注释Python 变量1. 定义理解2. 变量名命名3. 分配多个值4. 输出变量5. 全局变量 前言一定要看 python能干什么?有什么用?好处在哪?不要我讲了,这不是我在博客该讲的,言简意赅就是:通俗易懂,上手快,实用强。我会根据自己个人理解以及国外官网翻译为中文对大家进行讲解。完整源码我也会在最下面带上地址。内容过多,我不会全部演示,你完全可以复制粘贴到自己的pycharm上运行即可。 不管是国内的菜鸟教程还是我在这里的翻译,至少你跟

全栈川川 5万+

了解C#中Lambda表达式的用法

Lambda表达式是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量。它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式。

风清扬的专栏 422

OpenClaw Manager Pro - 可视化管理工具

OpenClaw Manager Pro 是一个现代化的 Web 管理界面,用于管理多个 OpenClaw Gateway 实例。🎨美观的界面:深色主题,渐变设计,现代化 UI📡实时监控:WebSocket 实时推送状态和日志🔧完整管理:创建、编辑、删除、启动、停止 Gateway📊多渠道支持:飞书、Telegram、Discord、Slack、微信、钉钉🧩技能管理:可视化配置 61+ 个技能🌍跨平台:支持 macOS、Linux、Windows使用自定义模型系统会自动在中创建},

Maynor的博客 3087

YOLO11,ultralytics-main源代码目录结构详解

本文详细介绍了YOLO11框架的ultralytics-main源代码目录结构,帮助用户更好地理解和使用YOLO模型。主要目录包括:docker文件夹,包含多种Docker镜像文件,适用于不同硬件环境;docs文件夹,存放YOLO的说明文档;examples文件夹,提供YOLO使用的示例代码;tests文件夹,包含单元测试模块;ultralytics文件夹,为核心代码所在,包含推理逻辑、配置、数据处理等模块。其中,engine文件夹负责训练和推理引擎,models文件夹存放模型架构,nn定义神经网络结构

qq_30279827的博客 1283

C# 的Lambda表达式‌常见用法和示例

简洁性‌:比匿名方法更短的语法。灵活性‌:支持闭包、异步、表达式树等高级场景。可读性‌:使代码更接近“做什么”而非“怎么做”。集成性‌:深度融入 LINQ、异步编程、EF Core 等框架。

ByteGeek 946

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C# Linq语句用法大全以及Lambda表达式

C# Linq语句用法大全以及Lambda表达式

weixin_45897514的博客 978

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C# 中 LINQ 和 Lambda 表达式的 基本用法

C# 中 LINQ 和 Lambda 表达式的 基本用法

jackylzh的专栏 418

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

在 C# 中,什么是 Lambda 表达式,它的用法是什么?

在 C# 中,Lambda 表达式是一种简洁的语法,用于创建匿名函数。这些函数可以有输入参数,并且返回一个值。Lambda 表达式通常用于定义内联代码块,特别是在使用 LINQ(Language Integrated Query)或委托时非常常见。

weixin_45422672的博客 463

C#—Lambda表达式用法

/* * Lambda表达式的方法 */ using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; namespace ConsoleApplicati

LY_624的专栏 927

Lambda表达式 C# 里的 => 用法

Lambda表达式是C#3.0的新内容,如果您之前学习的C#2.0,不认识也就不奇怪了。给您举个例子。例如,我定义一个委托:delegate int Method(int a, int b);再定义一个方法:int Add(int a, int b){return a + b;}我可能需要这样通过委托调用方法:Method m += Add;Console.WriteLine(m(2, ...

avayan8006的博客 182

C# 委托用法、匿名方法、Lambda表达式

编写一个函数,如普通的冒泡排序,只能对指定的如int[]进行排序,但是如果想对自定义的数据类型进行排序,则不能实现,通过委托则可以很好的实现不同类型使用同一方法这一功能,如下面的代码所示 class BubbleSorter { static public void Sort(IList sortArray, Func comparison) {

rainy days 366

lambda表达式用法——C#学习笔记

Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。

山水CAD 二次开发 741

C#学习随笔—委托和Lambda表达式的基本用法

  在之前更新的文章中,有一篇C#的文章中,出现了两个比较类似的方法,C#学习随笔—自定义控件(线,箭头等图形)。我突然意识到,这一块完全可以用委托和Lambda表达式达成更加简洁的写法,同时,将这两个概念也分享一下,或许,大家在平时也会用到。   大概说一下,我的方法实现的功能。已经Start和End点的坐标,以及Offset的值,求解A点的坐标。见下图:      我之前文章中的代码如下:   //get x value of triangle   private float tri_x_

linjingyg的博客 328
上一篇: C#事件的简略声明
下一篇: C#常用异步方法调用(1)_Async/Await特性详细总结
PittDing
博客等级 码龄7年 227粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值