C C 知識回顧 Lambda

2022-01-12 11:40:05 字數 4266 閱讀 5306

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

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

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

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

delegate

int mydel(int

x);

static

void main(string

args)

建立表示式樹:

expression

mydel = x => x++;

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

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

1//2

//摘要: 3//

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

5//引數: 6//

source:7//

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

9//predicate:

10//

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

11//

12//

型別引數:

13//

tsource:

14//

source 中的元素的型別。

15//

16//

返回結果:

17//

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

18//

19//

異常:

20//

system.argumentnullexception:

21//

source 或 predicate 為 null。

22public

static ienumerablewhere(this ienumerablesource, funcbool> predicate);

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

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

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

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

如:  

( ) => true;

x => x == 1

;  (x) => x == 1

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

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

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

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

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

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

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

delegate

void mydel(string

s);

//...

mydel mydel = n => ;

mydel(

"hi,

");

通過 async 和 await 關鍵字,我們可以很簡單並快速的建立包含非同步處理的 lambda 表示式和語句。博主發表了約 8 篇關於非同步的文章,你可以 點選進入目錄 。

這裡,我使用簡單的非同步呼叫方式,編寫執行按鈕觸發的點選事件,即呼叫非同步方法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 中的引數都是一種委託型別的引數,如 func,可以定義輸入引數以及返回型別。博主也發表了多篇關於 linq 的文章,你也可以 點選進入目錄 。

public

delegate tresult func(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 主體、引數的委託型別以及 c# 語言規範和其它等一些因素,對我們所寫的 lambda 進行型別推斷。

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

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

var nums = new ;   //

int 型別

var comparenum = 2.5

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

《c# 知識回顧 - 序列化》

《c# 知識回顧 - 表示式樹 expression trees》

《c# 知識回顧 - 特性 attribute》、《剖析 assemblyinfo.cs - 了解常用的特性 attribute》

《c# 知識回顧 - 委託 delegate》、《c# 知識回顧 - 委託 delegate (續)》

《c# 知識回顧 - 事件入門》、《c# 知識回顧 - event 事件》

《string 與 string,大 s 與小 s 之間沒有什麼不可言說的秘密》

《c# 知識回顧 - 你真的懂異常(exception)嗎?》

《了解過入口函式 main() 嗎?帶你用批處理玩轉 main 函式》

《c# 基礎回顧 - 匿名方法》

【博主】反骨仔

【原文】

【參考】微軟官方文件

C C 知識回顧 指標

1 非空的區別。引用不能為空。2 可修改區別。引用一旦被初始化,就會一直指向初始化的物件。3 合法性區別。在程式設計時,使用指標之前應該檢測其是否為空值。4 應用區別。指標多用於可能會不指向任何物件的情況 int f int int int f是乙個函式指標,它指向引數是兩個int的函式,該函式的返...

C C 知識回顧(二) Sizeof

1.指標大小為4個位元組 2.結構體內的元素長度都小於處理器的位數的時候,以最長的資料元素作為對齊單位 如果結構體內存在長度大於處理器位數的元素,那麼就以處理器的位數為對齊單位 3.注意位址對齊 4.static 靜態變數存放在全域性資料區,sizeof不會計算它。5.char s 01234567...

C C 知識回顧 繼承與介面

1.關於虛繼承 b繼承a,c繼承a,d同時繼承bc,則初始化d時將會產生兩個a。b虛繼承a,c虛繼承a,d同時繼承bc,則bc共用乙個a 2.關於多繼承的方法呼叫 class a class b class c public a,public b int main 3.在繼承的時候如果不指定publ...