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

vtk相机_分别用 VTK 体绘制和面绘制来实现医学图像三维重建;

序言,VTK介绍:VTK 全称为 The Visualization Toolkit (可视化工具),是一个开源、跨平台、自由获取、支持并行计算的图形应用函数;拥有3D 渲染的最新工具、提供3D交互模式以及2D绘图等。VTK 包含一个C++类库,目前提供了众多语言接口,例如 Java、Python、TCL;在三维函数库OpenGL 的基础上采用面向对象设计方法发展起来图形学基本概念和数据...

weixin_39665302的博客 689

gtsam 学习十(ISAM2 理论)

翻译自:iSAM2: Incremental Smoothing and Mapping Using the Bayes Tree 摘要 提出了一种新型的贝斯树处理稀疏矩阵,在转化为因子图,可以更好的求解平方根信息和映射问题。 文中提出了三个概念 使用概率密度项进行矩阵分解 介绍如何将矩阵分解转换为贝叶斯数和条件概率密度 基于贝叶斯树提供了一种新的系数非线性优化:ISAM2(进行重新排序和重新线性化,避免了批量更新) 问题描述 文章聚焦与如何用增量实时解决非线性问题, 利用增量即新的测量值实时更新估

weixin_37781153的博客 8409

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

亚马逊(Amazon ads)广告API申请步骤(已经更新完)

你如果是自己的店铺使用,就选择左边的、如果是授权的那种给别人用就选右边的。审核通过了才能进行下一步,我目前就是刚申请完,后续会持续更新!然后会调整到,下面的页面,选择Agency然后右上角点击创建。审核通过会发邮件到你的企业邮箱、时间大概是1-7天左右。输入对应的信息,点击提交审核,就可以开始申请了。1、广告平台跟卖家平台是分开的,这个概念要清楚。2、注册广告一定要用企业邮箱!回到首页,点击成为合作伙伴。注册了以后会跳转到广告。然后再点击加入合作伙伴。然后会弹出下面的页面。

阿泽的博客 5657

C#中Lambda表达式的用法

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

xujianjun229的博客 793

ADRV9009的学习历程(一)

** AD9361的同胞ADRV9009 ** 终于记录一下了 距离第一次想写博客记录自己学习的点点滴滴,大概已经过去有一年有余。一直都是停留在心有余而力不足的境界。 基本每次做项目遇到问题都会来优快云寻求帮助,这里虽离庙堂较远,但高手云集。每每读来,思绪万千,次次膜拜。 趁这次又学习了一样新物件,就记录一下,望大神看见能赐教一下。 ADRV9009 最近有项目要用到ADRV9009这个芯片。就来学习一下。做过AD9361的都知道,ADI官方会给出这个芯片的参考手册、数据手册和驱动程序。当然我只是见过AD

weixin_42868560的博客 1万+

uniapp+华为HBuilder X 4.29跑鸿蒙模拟器报错没有签名授权

uniapp+华为HBuilder X 4.29跑鸿蒙模拟器报错没有签名授权报错信息11:39:47.976 安装 .hap 到鸿蒙设备 ...11:39:48.517 运行所需的权限没有签名授权,请参考 配置文档11:39:48.517 安装失败。

weixin_66071584的博客 1350

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

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

写着玩儿的博客 353

书旗app字符串加密分析

本文案例是对书旗app搜索接口的请求密文进行分析和逆向。

李玺 3156

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

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

风清扬的专栏 422

计算机组成原理(第三版)唐朔飞-第一章第二章-课后习题

计算机组成原理

weixin_45735391的博客 7万+

基于 Python + Flask + Echarts 的疫情监控系统

基于 Python + Flask + Echarts 的疫情监控系统

743

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

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

ByteGeek 946

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

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

weixin_45897514的博客 978

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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、付费专栏及课程。

余额充值