C#Lambda表達式詳解


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

對於經本博主明確授權和許可使用文章及內容的,使用時請注明文章或內容出處並注明網址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM