C Lambda 知識回顧

2022-10-06 06:48:13 字數 3389 閱讀 6315

它是第十乙個希臘字母,乙個擁有失意、無奈、孤獨、低調等含義的流行符號,也指示一款稱為「半年命」的遊戲。

不過,這次我所講的是 c# 中的 lambda。

目錄lambda 簡介

lambda 表示式,是一種簡化的匿名函式,可用於建立委託或表示式目錄樹。其次,你也可以將 lambda 表示式作為引數進行傳遞,或者將它作用於函式呼叫值呼叫後返回的乙個函式來使用。我們經常在 linq 中使用 lambda 表示式。

建立 lambda 表示式的簡單語法形式:輸入引數 => 表示式或語句塊。其中,=> 為 lambda 運算子,可讀作「goes to」 。

delegate int mydel(i x);

static void main(string args)

建立表示式樹:

expression mydel = x => x++;  

=> 運算子和 = 運算子 (賦值運算子),具有相同的優先順序,並且都是右結合運算。

我們經常在 linq 查詢中使用 lambda 表示式,如作為 where 的引數。該方法有多個過載,這裡只列舉了其中乙個。

//// 摘要:

// 基於謂詞篩選值序列。

//// 引數:

// source:

// 要篩選的 system.collections.generic.ienumerable。

//// predicate:

// 用於測試每個元素是否滿足條件的函式。

//// 型別引數:

// tsource:

// source 中的元素的型別。

//// 返回結果:

// 乙個 system.collections.generic.ienumerable,包含輸入序列中滿足條件的元素。

//// 異常:

// system.argumentnullexception:

// source 或 predicate 為 null。

public static ienumerable where(this ienumerable source, func predicate);

引數是委託型別 func predicate),這裡使用 lambda 表示式進行建立我想應該是最合適的。還有,假如引數型別為抽象類的 system.linq.expressions.expression,其中 func 委託是過載具有十六個引數的,你也可以使用 lambda 表示式建立對應的表示式樹。

【注意】在 is 或 as 運算子的左側不允許使用 lambda 表示式。

lambda 表示式

表示式在 => 運算子右側,稱「lambda 表示式」。lambda 表示式常用於 linq 和構建表示式樹,它也允許返回結果。

基本形式:( 輸入引數 ) => 表示式 。

如:  

( ) => true;

x => x == 1;

(x) =>www.cppcns.com x == 1;

(x, y) => x == y;

【備註】當 lambda 表示式有且只有乙個輸入引數的時侯,括號(「()」)才是可選的。 括號內存在多個輸入參www.cppcns.com數時使用「,」進行分割。

你也可以選擇顯式指定型別,一般只有在編譯器難以或無法準確推斷輸入型別的時候。

func func = (int x, int y) => x == y;

這裡使用空括號(「()」)指定零個輸入引數,並且可以在 lambda 的主體包含乙個或多個方法進行呼叫。

() => yourmethod()

lambda 語句

lambda 語句和上面的 lambda 表示式相比,只是多了個大括號(「」)。 

基本形式:( 輸入引數 ) => 。

lambda 語句的主體可以由任意數量的普通語句組成,不過,我們一般寫的語句不多(三個左右吧)。

delegate void mydel(string s);

// ...

mydel mydel = n => ;

mydel("hi,");

非同步 lambda

通過 async 和 await 關鍵字,我們可以很簡單並快速的建立包含非同步處理的 lambda 表示式和語句。

這裡,我使用簡單的非同步呼叫方式,編寫執行按鈕觸發的點選事件,即呼叫非同步方法 doasync。

public partial class form1 : form

private async void button1_click(object sender, eventargs e)

async task doasync()

}現在,簡化上面的的 click 事件,並加上 async。

public partial class form1 : form

; }

async task doasync()

}在 linq 中使用 lambda

許多 linq 中的引數都是一種委託型別的引數,如 func,可以定義輸入引數以及返回型別。

public delegate tresult func程式設計客棧t>(targ0 arg0)  

func 表示:int 為輸入引數,bool 為返回值。

func 表示:2個 int 為輸入引數,乙個 bool 為返回值。

示例:func myfunc = x => x == 250;

var result = myfunc(1314);

c# 的編譯器可以自動推斷輸入引數的型別,即便是多個輸入引數,當然,你也可以選擇顯式指定。

var nums = new ;

var query = nums.count(x => x > 2);

var query2 = nums.count(x => x < 2);

【備註】不要將 => 和 >= 搞錯了,前者是 lambda 運算子,後者是算術比較運算子。

lambda 中的型別推斷

編譯器會根據 lambda 主體、引數的委託型別以及 c# 語言規範和其它等一些因素,對我們所寫的 lambda 進行型別推斷。

在這裡,由於源資料是乙個 int 陣列,即我要查的資料為 ienumerable 型別,編譯器在這裡自動推斷元素為 int 型別,意味著 count 方法內的 x 你可以通過 「.」 在 vs 中顯示對應 int 型別的屬性和方法。

lambda 中的變數使用範圍

我們可以在 lambda 的主體中引用範圍之外的變數。如:

var nums = new ; //int 型別

var comparenum = 2.5;

var query = nums.count(x => x == comparenum);

lambda 的特點

本文標題: c# lambda 知識回顧

本文位址:

MySQL知識回顧 MySQL基礎知識回顧

markdownpad document mysql mysql 是用於管理檔案的乙個軟體 服務端軟體 socket服務端 本地檔案操作 解析指令 sql語句 客戶端軟體 各種各樣 socket客戶端 傳送指令 解析指令 sql語句 ps dbms 資料庫管理系統 sql語句 需要掌握的技能 安裝 ...

MySQL知識回顧 MySQL基礎知識回顧

markdownpad document mysqlmysql 是用於管理檔案的乙個軟體 服務端軟體 socket服務端 本地檔案操作 解析指令 sql語句 客戶端軟體 各種各樣 socket客戶端 傳送指令 解析指令 sql語句 ps dbms 資料庫管理系統 sql語句 需要掌握的技能 安裝 服...

Vue知識回顧

年初第乙個 flag 就是掌握 vue 哈哈 vue react angular 三大主流框架,最後我選擇學習 vue 接觸過 react 自己感覺學習曲線有些陡峭,進而我選擇了學習 vue 他的學習曲線平穩很多 不管選擇什麼框架,除了對基礎的知識有一定的了解掌握,還應該對 es6 有一定的了解 這...