C#Lambda表达式详解

简介: Lambda表达式教程本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —— 心分享、...

Lambda表达式教程


本文提供全流程,中文翻译。

Chinar 坚持将简单的生活方式,带给世人!

(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)


Chinar —— 心分享、心创新!

助力快速理解 Lambda 表达式的用法、规范

为新手节省宝贵的时间,避免采坑!



全文高清图片,点击即可放大观看 (很多人竟然不知道)


1

Lambda —— 表达式


Lambda 表达式是一个匿名函数,用它可以高效简化代码,常用作委托,回调

Lambda 表达式都使用运算符=>,所以当你见到这个符号,基本上就是一个 Lambda 表达式

Lambda 运算符的左边是输入参数(),=>,右边是表达式或语句块

Lambda 表达式,是可以访问到外部变量的

可以将此表达式分配给委托类型
举个栗子黑白88

/// <summary>
    /// 控制台程序自己创建的一个测试类
    /// </summary>
    class Chinar
    {
        /// <summary>
        /// 方法A
        /// </summary>
        /// <param name="a">整形</param>
        /// <param name="b">整形</param>
        /// <returns>整形</returns>
        static int MethodA(int a, int b)
        {
            return a + b;
        }


        static void Main(string[] args)
        {
            //Lambda 表达式不需要声明类型,因为前边3个 int 定义过了 ;=>是固定格式
            //有匿名函数的地方,就可以用 Lambda 表达式来代替
            Func<int, int, int> lambda = (args1, args2) => { return args1 + args2; };
            Console.WriteLine("表达式1:" + lambda(100, 1));

            //当传入参数只有一个时,可省略很多
            //不需要括号,不需要return关键字,编译器会自动完成添加
            Func<int, int> lambda2 = a => a * a;
            Console.WriteLine("表达式2:" + lambda2(9));


            Console.ReadLine();
        }
    }

2

Parameter —— 参数


Lambda 只有一个参数时,可以省略括号

如果多个参数,则必须加括号,并且用隔开

举个栗子黑白88
单参数 ,匿名函数:

x => x * x; //传入参数为:x,返回值为 x*x 的值

多参数 ,匿名函数:

(x, y) => x == y;//传入参数为:x,y,返回值为 bool 值

3

Empty return value —— 空返回值函数


当我们所需的函数返回值为空时,需要指定空返回值
举个栗子黑白88
无参数 ,无返回值,匿名函数:

using UnityEngine;


public class ChinarLambda : MonoBehaviour
{
    delegate void  ChinarDelegate(); //委托 ChinarDelegate ,空返回值,无参数
    ChinarDelegate cd;               //委托对象


    void Start()
    {
        cd = () => { print("Chinar"); }; //无参数,无返回值,{函数代码块}:打印Chinar
        cd();                            //调用委托
    }
}

运行结果:打印

Chinar

有参数 ,无返回值,匿名函数:

using UnityEngine;


public class ChinarLambda : MonoBehaviour
{
    delegate void  ChinarDelegate(int a, int b); //委托 ChinarDelegate ,空返回值,2个 Int 参数
    ChinarDelegate cd;                           //委托对象


    void Start()
    {
        cd = (a, b) =>{print(a); print(b);}; //传入参数为:a,b,{函数代码块}:分别打印 a b 的值
        cd(1, 2);                            //调用委托
    }
}

运行结果:打印

1
2

4

Lambda Statement —— 表达式 语句


当表达式,函数体有多个语句时,只需要将所有代码写入 { 方法体 }
举个栗子黑白88
有参数 ,无返回值,匿名函数:

using UnityEngine;


public class ChinarLambda : MonoBehaviour
{
    delegate void  ChinarDelegate(string str); //委托 ChinarDelegate ,空返回值,2个 Int 参数
    ChinarDelegate cd;                         //委托对象


    void Start()
    {
        cd = s =>
        {
            string str = s + "|" + s;
            print(str);
        };            //传入参数为:s,{函数代码块}:
        cd("Chinar"); //调用委托
    }
}

运行结果:打印

Chinar|Chinar

5

Example 1 —— 示例1


调用 LinQ First 函数

First 函数会找到满足条件,最近的一个

a: strList 数组中的元素,如果元素的长度大于 5 返回满足条件的 a 元素
举个栗子黑白88
有参数 ,无返回值,匿名函数:

using System.Collections.Generic;
using System.Linq;
using UnityEngine;


public class ChinarLambda : MonoBehaviour
{
    void Start()
    {
        List<string> strList = new List<string>()//声明一个 string 列表,并添加数据
        {
            "ABC",
            "123456",
            "哈哈",
            "1234567890"
        };
        string result = strList.First(a => a.Length > 5); //LinQ 的 First函数,a:是strList数组中的元素,如果元素的长度大于5;—— First 函数会找到满足条件,最近的一个
        print(strList.First(a => a.Length > 5));          //Lambda 表达式的返回值是根据你的函数决定的,在此是string类型的返回值,所以可以直接写一句
    }
}

运行结果:打印

123456

6

Example 2 —— 示例2


直接将用表达式代替委托类型,可大量精简代码量
举个栗子黑白88

using System;
using UnityEngine;


public class ChinarLambda : MonoBehaviour
{
    void Start()
    {
        // 1
        //传入参数是 Chinar,所以 s 此时就代表 "Chinar",因为在 LambdaFun 函数中 print(func(str)) 方法,是以传入参数,传给了委托
        //在此经过了 Lambda 直接对 “Chinar” 进行处理,并返回处理后的字符串,直接打印
        LambdaFun("Chinar", s => s.Replace("Chinar", "毋桐"));

        // 2
        //原理同上
        LambdaFun("大侦探福尔马林", s =>
        {
            if (s.Contains("马林"))
            {
                s = s.Replace("马林", "摩斯");
            }
            return s;
        });
    }


    /// <summary>
    /// 测试表达式函数
    /// </summary>
    /// <param name="str">入参:字符串</param>
    /// <param name="func">入参:Func委托</param>
    public void LambdaFun(string str, Func<string, string> func)
    {
        print(func(str)); //打印 经过委托处理后返回的字符
    }
}

运行结果:打印

123456

7

Toggle AddListener Lambda —— 动态添加监听方法 Lambda


再举个例子

在动态监听方法时,可直接简化/省略另建方法

并且 Lambda 表达式,可以访问到外部变量的

未完。。。
举个栗子黑白88

using UnityEngine;
using UnityEngine.UI;


/// <summary>
/// Chinar专用测试类
/// </summary>
public class ChinarDemo : MonoBehaviour
{
    void Start()
    {
        //找到组件,动态添加监听,Lambda表达式,精简!外加三目运算
        GameObject.Find("Toggle").GetComponent<Toggle>().onValueChanged.AddListener(isOn => print(isOn ? "开" : "关"));
    }


    /// <summary>
    /// 直接可省略此方法 —— 监听方法:可手动/动态绑定
    /// 二者效果一样
    /// </summary>
    /// <param name="isOn"></param>
    public void OnClick(bool isOn)
    {
        if (isOn)
        {
            print("开");
        }
        else
        {
            print("关");
        }
    }
}

支持

May Be —— 搞开发,总有一天要做的事!


拥有自己的服务器,无需再找攻略!

Chinar 提供一站式教程,闭眼式创建!

为新手节省宝贵时间,避免采坑!


先点击领取 —— 阿里全产品优惠券 (享受最低优惠)


1 —— 云服务器超全购买流程 (新手必备!)

2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)

3—— Windows 服务器配置、运行、建站一条龙 !

4 —— Linux 服务器配置、运行、建站一条龙 !





技术交流群:806091680 ! Chinar 欢迎你的加入


END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

相关文章
|
8月前
|
开发框架 .NET 编译器
C# 10.0中Lambda表达式的改进:更简洁、更灵活的代码编写体验
【1月更文挑战第21天】随着C#语言的不断发展,Lambda表达式作为一种简洁、高效的函数式编程工具,在C# 10.0中迎来了重要的改进。本文将详细探讨C# 10.0中Lambda表达式的新特性,包括参数类型的推断增强、自然类型的Lambda参数以及Lambda表达式的属性改进等。这些改进不仅简化了Lambda表达式的编写过程,还提升了代码的可读性和灵活性,为开发者带来了更优质的编程体验。
|
4月前
|
开发框架 自然语言处理 .NET
C#一分钟浅谈:LINQ 查询表达式的使用技巧
【9月更文挑战第6天】LINQ(Language Integrated Query)是C#开发中的强大工具,使查询数据集合变得简单且接近自然语言。本文从基础入手,通过具体示例讲解LINQ查询表达式的使用技巧,包括过滤、排序和分组等操作。同时,文章还探讨了常见问题及解决方法,如性能优化、过早枚举和类型转换等,帮助开发者写出更高效、易维护的代码。
108 15
|
4月前
|
C#
C#一分钟浅谈:Lambda 表达式和匿名方法
本文详细介绍了C#编程中的Lambda表达式与匿名方法,两者均可用于定义无名函数,使代码更简洁易维护。文章通过基础概念讲解和示例对比,展示了各自语法特点,如Lambda表达式的`(parameters) =&gt; expression`形式及匿名方法的`delegate(parameters)`结构。并通过实例演示了两者的应用差异,强调了在使用Lambda时应注意闭包问题及其解决策略,推荐优先使用Lambda表达式以增强代码可读性。
56 8
|
6月前
|
SQL 开发框架 前端开发
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
|
8月前
|
C#
C#动态查询:巧用Expression组合多条件表达式
在C#中,利用`Expression`类和`AndAlso`、`OrElse`方法,可以组合两个`Expression&lt;Func&lt;T, bool&gt;&gt;`以实现动态多条件查询。该方法通过构建表达式树,方便地构建复杂查询。示例代码展示了如何创建表达式树,分别检查年龄大于等于18和姓名为&quot;John&quot;的条件,并使用`AndAlso`组合这两个条件,最终编译为可执行的委托进行测试。
336 1
|
8月前
|
SQL 开发框架 .NET
C#linq表达式的应用
C#linq表达式的应用
45 0
|
8月前
|
开发框架 .NET 编译器
C#学习相关系列之匿名方法和Lambda表达式
C#学习相关系列之匿名方法和Lambda表达式
|
8月前
|
开发框架 .NET 编译器
C# 9.0中的目标类型新表达式:类型推断的又一进步
【1月更文挑战第16天】C# 9.0引入了目标类型新表达式,这是类型推断功能的一个重要扩展。通过目标类型新表达式,开发者在创建对象时可以省略类型名称,编译器会根据上下文自动推断所需类型。这一特性不仅简化了代码编写,还提高了代码的可读性和维护性。本文将详细介绍目标类型新表达式的语法、使用场景及其对C#编程的影响。
|
8月前
|
机器学习/深度学习 开发框架 .NET
C# 中的 Lambda 表达式:一种简洁而强大的编程工具
【1月更文挑战第6天】在现代编程中,Lambda 表达式已经成为一种非常流行的编程范式。C# 作为一种功能强大的、面向对象的编程语言,自然也不例外。Lambda 表达式在 C# 中提供了一种简洁、灵活的方式来表示匿名函数。这些函数可以被用作委托或表达式树类型,从而在各种不同的上下文中使用。
|
2月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
44 3