它是第十乙個希臘字母,乙個擁有失意、無奈、孤獨、低調等含義的流行符號,也指示一款稱為「半條命」的遊戲。
不過,這次我所講的是 c# 中的 lambda。
lambda 表示式,是一種簡化的匿名函式,可用於建立委託或表示式目錄樹。其次,你也可以將 lambda 表示式作為引數進行傳遞,或者將它作用於函式呼叫值呼叫後返回的乙個函式來使用。我們經常在 linq 中使用 lambda 表示式。
建立 lambda 表示式的簡單語法形式:輸入引數 => 表示式或語句塊。其中,=> 為 lambda 運算子,可讀作「goes to」 。
delegate建立表示式樹:int mydel(int
x);
static
void main(string
args)
expressionmydel = x => x++;
=>
運算子和 = 運算子 (賦值運算子),具有相同的優先順序,並且都是右結合運算。
我們經常在 linq 查詢中使用 lambda 表示式,如作為 where的引數。該方法有多個過載,這裡只列舉了其中乙個。
1//2引數是委託型別 funcpredicate),這裡使用 lambda 表示式進行建立我想應該是最合適的。還有,假如引數型別為抽象類的 system.linq.expressions.expression,其中 func 委託是過載具有十六個引數的,你也可以使用 lambda 表示式建立對應的表示式樹。//摘要: 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);
【注意】在 is 或 as 運算子的左側不允許使用 lambda 表示式。
表示式在 => 運算子右側,稱「lambda 表示式」。lambda 表示式常用於 linq 和構建表示式樹,它也允許返回結果。
基本形式:( 輸入引數 ) => 表示式 。
如:
( ) => true;【備註】當 lambda 表示式有且只有乙個輸入引數的時侯,括號(「()」)才是可選的。 括號內存在多個輸入引數時使用「,」進行分割。x => x == 1
; (x) => x == 1
; (x, y) => x == y;
你也可以選擇顯式指定型別,一般只有在編譯器難以或無法準確推斷輸入型別的時候。
funcfunc = (int x, int y) => x == y;這裡使用空括號(「()」)指定零個輸入引數,並且可以在 lambda 的主體包含乙個或多個方法進行呼叫。
() => yourmethod()lambda 語句和上面的 lambda 表示式相比,只是多了個大括號(「」)。
基本形式:( 輸入引數 ) => 。
lambda 語句的主體可以由任意數量的普通語句組成,不過,我們一般寫的語句不多(三個左右吧)。
delegate通過 async 和 await 關鍵字,我們可以很簡單並快速的建立包含非同步處理的 lambda 表示式和語句。博主發表了約 8 篇關於非同步的文章,你可以 點選進入目錄 。void mydel(string
s);
//...
mydel mydel = n => ;
mydel(
"hi,
");
這裡,我使用簡單的非同步呼叫方式,編寫執行按鈕觸發的點選事件,即呼叫非同步方法doasync
。
public現在,簡化上面的的 click 事件,並加上 async。partial
class
form1 : form
private
async
void button1_click(object
sender, eventargs e)
async
task doasync()
}
public許多 linq 中的引數都是一種委託型別的引數,如 func,可以定義輸入引數以及返回型別。博主也發表了多篇關於 linq 的文章,你也可以 點選進入目錄 。partial
class
form1 : form
; }
async
task doasync()
}
publicfunc表示:int 為輸入引數,bool 為返回值。delegate tresult func(targ0 arg0)
func表示:2個 int 為輸入引數,乙個 bool 為返回值。
示例:
func myfunc = x => x == 250c# 的編譯器可以自動推斷輸入引數的型別,即便是多個輸入引數,當然,你也可以選擇顯式指定。;
var
result = myfunc(1314);
var nums = new ;【備註】不要將 => 和 >= 搞錯了,前者是 lambda 運算子,後者是算術比較運算子。var query = nums.count(x => x > 2
);
var query2 = nums.count(x => x < 2);
編譯器會根據 lambda 主體、引數的委託型別以及 c# 語言規範和其它等一些因素,對我們所寫的 lambda 進行型別推斷。
在這裡,由於源資料是乙個 int 陣列,即我要查的資料為 ienumerable型別,編譯器在這裡自動推斷元素為 int 型別,意味著 count 方法內的 x 你可以通過 「.」 在 vs 中顯示對應 int 型別的屬性和方法。
我們可以在 lambda 的主體中引用範圍之外的變數。如:
var nums = new ; //《c# 知識回顧 - 序列化》int 型別
var comparenum = 2.5
;var query = nums.count(x => x == comparenum);
《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...