Lambda 表達式

来源:https://www.cnblogs.com/nnnnnn/archive/2019/07/22/11224649.html
-Advertisement-
Play Games

1 Lambda —— 表達式 Lambda 表達式是一個匿名函數,用它可以高效簡化代碼,常用作委托,回調 Lambda 表達式都使用運算符=>,所以當你見到這個符號,基本上就是一個 Lambda 表達式 Lambda 運算符的左邊是輸入參數(),=>,右邊是表達式或語句塊 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 返回滿足條件的 元素 
舉個慄子黑白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("關");
        }
    }
}

引用:https://www.cnblogs.com/chinarbolg/p/9601422.html

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • C# 解決用戶領取優惠券,同一個用戶需要加鎖驗證是否已經領取,不同用戶則可以同時領取。 ...
  • 1.ThreadStart 線程執行帶參數的方法,new Thread(new ThreadStart(delegate { ThreadTask(firstPage, lastPage); })); 2.System.Threading.ParameterizedThreadStart其實沒有必要 ...
  • 一、設置 登錄百度雲控制台,添加應用-添加人臉識別,查找,對比等。 記住API Key和Secret Key 二、創建Demo程式 1、使用Nuget安裝 Baidu.AI 和 Newtonsoft.Json 2、直接下載 C# SDK 3、案例代碼 4、最終界面 ...
  • 一、Angel工作室簡單通用許可權系統簡介 AngelRM(Asp.net MVC Web api)是基於asp.net(C#)MVC+前端bootstrap+ztree+lodash+jquery技術,採用bootstrap為前臺開發展示UI,Web Api主要負責前端的邏輯交互,再結合jQuery ...
  • 一、前言 surging 開源地址:https://github.com/dotnetcore/surging 隨著業務的發展,併發量的增多,業務的複雜度越來越大,對於系統架構能力要求越來越高,這時候微服務的設計思想應運而生,但是對於微服務需要引擎進行驅動,這時候基於.NET CORE 的微服務引擎 ...
  • OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", "");OSGeo.GDAL.Gdal.AllRegister();OS... ...
  • 最近一個項目中用到了https的請求,在實際調用過程中發現之前的http方法不支持https,調用一直報錯。 查詢了一下,添加幾行代碼解決問題。 public string HttpPost(string Url, string postDataStr, string useragent = nul ...
  • 描述: 在 C# 中,System.Threading.Thread 類用於線程的工作。它允許創建並訪問多線程應用程式中的單個線程。進程中第一個被執行的線程稱為主線程。 案例: static void Main(string[] args) { int num = 100; for (int i = ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...