C# Lambda 知識(shí)回顧
序
它是第十一個(gè)希臘字母,一個(gè)擁有失意、無(wú)奈、孤獨(dú)、低調(diào)等含義的流行符號(hào),也指示一款稱為“半年命”的游戲。
不過,這次我所講的是 C# 中的 Lambda。
目錄
- Lambda 簡(jiǎn)介
 - Lambda 表達(dá)式
 - Lambda 語(yǔ)句
 - 異步 Lambda
 - 在 LINQ 中使用 Lambda
 - Lambda 中的類型推斷
 - Lambda 中的變量使用范圍
 - Lambda 的特點(diǎn)
 
Lambda 簡(jiǎn)介
Lambda 表達(dá)式,是一種簡(jiǎn)化的匿名函數(shù),可用于創(chuàng)建委托或表達(dá)式目錄樹。其次,你也可以將 Lambda 表達(dá)式作為參數(shù)進(jìn)行傳遞,或者將它作用于函數(shù)調(diào)用值調(diào)用后返回的一個(gè)函數(shù)來(lái)使用。我們經(jīng)常在 LINQ 中使用 Lambda 表達(dá)式。
創(chuàng)建 Lambda 表達(dá)式的簡(jiǎn)單語(yǔ)法形式:輸入?yún)?shù) => 表達(dá)式或語(yǔ)句塊。其中,=> 為 Lambda 運(yùn)算符,可讀作“goes to” 。
delegate int MyDel(int x); 
 static void Main(string[] args) 
 { 
  MyDel myDel = x => x++; 
  var j = myDel(5); 
 }
創(chuàng)建表達(dá)式樹:
Expression<MyDel> myDel = x => x++;  
=> 運(yùn)算符和 = 運(yùn)算符 (賦值運(yùn)算符),具有相同的優(yōu)先級(jí),并且都是右結(jié)合運(yùn)算。
我們經(jīng)常在 LINQ 查詢中使用 Lambda 表達(dá)式,如作為 Where<TSource> 的參數(shù)。該方法有多個(gè)重載,這里只列舉了其中一個(gè)。
// // 摘要: // 基于謂詞篩選值序列。 // // 參數(shù): // source: // 要篩選的 System.Collections.Generic.IEnumerable<T>。 // // predicate: // 用于測(cè)試每個(gè)元素是否滿足條件的函數(shù)。 // // 類型參數(shù): // TSource: // source 中的元素的類型。 // // 返回結(jié)果: // 一個(gè) System.Collections.Generic.IEnumerable<T>,包含輸入序列中滿足條件的元素。 // // 異常: // System.ArgumentNullException: // source 或 predicate 為 null。 public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
參數(shù)是委托類型 Func<TSource, bool> predicate),這里使用 Lambda 表達(dá)式進(jìn)行創(chuàng)建我想應(yīng)該是最合適的。還有,假如參數(shù)類型為抽象類的 System.Linq.Expressions.Expression<Func>,其中 Func 委托是重載具有十六個(gè)參數(shù)的,你也可以使用 Lambda 表達(dá)式創(chuàng)建對(duì)應(yīng)的表達(dá)式樹。
【注意】在 is 或 as 運(yùn)算符的左側(cè)不允許使用 Lambda 表達(dá)式。
Lambda 表達(dá)式
表達(dá)式在 => 運(yùn)算符右側(cè),稱“l(fā)ambda 表達(dá)式”。lambda 表達(dá)式常用于 LINQ 和構(gòu)建表達(dá)式樹,它也允許返回結(jié)果。
基本形式:( 輸入?yún)?shù) ) => 表達(dá)式 。
如:
( ) => true; x => x == 1; (x) => x == 1; (x, y) => x == y;
【備注】當(dāng) lambda 表達(dá)式有且只有一個(gè)輸入?yún)?shù)的時(shí)侯,括號(hào)(“()”)才是可選的。 括號(hào)內(nèi)存在多個(gè)輸入?yún)?shù)時(shí)使用“,”進(jìn)行分割。
你也可以選擇顯式指定類型,一般只有在編譯器難以或無(wú)法準(zhǔn)確推斷輸入類型的時(shí)候。
Func<int, int, bool> func = (int x, int y) => x == y;
這里使用空括號(hào)(“()”)指定零個(gè)輸入?yún)?shù),并且可以在 Lambda 的主體包含一個(gè)或多個(gè)方法進(jìn)行調(diào)用。
() => YourMethod()  
Lambda 語(yǔ)句
lambda 語(yǔ)句和上面的 lambda 表達(dá)式相比,只是多了個(gè)大括號(hào)(“{ }”)。
基本形式:( 輸入?yún)?shù) ) => { 表達(dá)式 } 。
lambda 語(yǔ)句的主體可以由任意數(shù)量的普通語(yǔ)句組成,不過,我們一般寫的語(yǔ)句不多(三個(gè)左右吧)。
delegate void MyDel(string s); 
// ...
MyDel myDel = n => { var s = n + " Fanguzai!"; Console.WriteLine(s); }; 
myDel("Hi,");
異步 Lambda
通過 async 和 await 關(guān)鍵字,我們可以很簡(jiǎn)單并快速的創(chuàng)建包含異步處理的 lambda 表達(dá)式和語(yǔ)句。
這里,我使用簡(jiǎn)單的異步調(diào)用方式,編寫執(zhí)行按鈕觸發(fā)的點(diǎn)擊事件,即調(diào)用異步方法 DoAsync。
public partial class Form1 : Form 
{ 
 public Form1() 
 { 
  InitializeComponent(); 
 } 
 private async void button1_Click(object sender, EventArgs e) 
 { 
  await DoAsync(); 
 } 
 async Task DoAsync() 
 { 
  await Task.Delay(250); 
 } 
}
現(xiàn)在,簡(jiǎn)化上面的的 Click 事件,并加上 async。
public partial class Form1 : Form 
{ 
 public Form1() 
 { 
  InitializeComponent(); 
  button1.Click += async (sender, e) => 
  { 
   await DoAsync(); 
  }; 
 } 
 async Task DoAsync() 
 { 
  await Task.Delay(250); 
 } 
}
在 LINQ 中使用 Lambda
許多 LINQ 中的參數(shù)都是一種委托類型的參數(shù),如 Func<T, TResult>,可以定義輸入?yún)?shù)以及返回類型。
public delegate TResult Func<TArg0, TResult>(TArg0 arg0)  
Func<int, bool> 表示:int 為輸入?yún)?shù),bool 為返回值。
Func<int, int, bool> 表示:2個(gè) int 為輸入?yún)?shù),一個(gè) bool 為返回值。
示例:
Func<int, bool> myFunc = x => x == 250; var result = myFunc(1314);
C# 的編譯器可以自動(dòng)推斷輸入?yún)?shù)的類型,即便是多個(gè)輸入?yún)?shù),當(dāng)然,你也可以選擇顯式指定。
var nums = new[] { 2, 5, 0 };
var query = nums.Count(x => x > 2);
var query2 = nums.Count<int>(x => x < 2);
【備注】不要將 => 和 >= 搞錯(cuò)了,前者是 Lambda 運(yùn)算符,后者是算術(shù)比較運(yùn)算符。
Lambda 中的類型推斷
編譯器會(huì)根據(jù) Lambda 主體、參數(shù)的委托類型以及 C# 語(yǔ)言規(guī)范和其它等一些因素,對(duì)我們所寫的 Lambda 進(jìn)行類型推斷。
在這里,由于源數(shù)據(jù)是一個(gè) int 數(shù)組,即我要查的數(shù)據(jù)為 IEnumerable<int> 類型,編譯器在這里自動(dòng)推斷元素為 int 類型,意味著 Count 方法內(nèi)的 x 你可以通過 “.” 在 VS 中顯示對(duì)應(yīng) int 類型的屬性和方法。
Lambda 中的變量使用范圍
我們可以在 Lambda 的主體中引用范圍之外的變量。如:
var nums = new[] { 2, 5, 0 }; //int[] 類型
var compareNum = 2.5;
var query = nums.Count(x => x == compareNum); 
Lambda 的特點(diǎn)
- Lambda 中包含輸入?yún)?shù)的數(shù)量,必須與委托類型包含的參數(shù)數(shù)量一致。
 - Lambda 中的每個(gè)輸入?yún)?shù),必須都能夠通過隱式轉(zhuǎn)換為其對(duì)應(yīng)的委托參數(shù)類型。
 - Lambda 中的返回值(如果有),必須能夠隱式轉(zhuǎn)換為委托的返回類型。
 
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持我們!
欄 目:C#教程
下一篇:詳解C#多線程之線程同步
本文標(biāo)題:C# Lambda 知識(shí)回顧
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6021.html
您可能感興趣的文章
- 01-10C#影院售票系統(tǒng)畢業(yè)設(shè)計(jì)(4)
 - 01-10日常收集C#接口知識(shí)(知識(shí)全面)
 - 01-10基于C#生成條形碼操作知識(shí)匯總附源碼下載
 - 01-10C#基礎(chǔ)知識(shí)之new關(guān)鍵字介紹
 - 01-10C#基礎(chǔ)知識(shí)之this關(guān)鍵字介紹
 - 01-10C#基礎(chǔ)知識(shí)之base關(guān)鍵字介紹
 - 01-10C#基礎(chǔ)知識(shí)之FileStream
 - 01-10C# 裝箱和拆箱的知識(shí)回顧
 - 01-10C# 6.0 的知識(shí)梳理
 - 01-10C# 表達(dá)式樹Expression Trees的知識(shí)梳理
 


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
 - 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
 - 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
 - 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
 - 5c語(yǔ)言計(jì)算三角形面積代碼
 - 6什么是 WSH(腳本宿主)的詳細(xì)解釋
 - 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
 - 8正則表達(dá)式匹配各種特殊字符
 - 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
 - 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
 
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
 - 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開的解決方案
 - 01-10WinForm限制窗體不能移到屏幕外的方法
 - 01-10WinForm繪制圓角的方法
 - 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
 - 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
 - 01-10C#停止線程的方法
 - 01-10C#實(shí)現(xiàn)清空回收站的方法
 - 01-10C#通過重寫Panel改變邊框顏色與寬度的
 - 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
 
隨機(jī)閱讀
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
 - 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
 - 01-10C#中split用法實(shí)例總結(jié)
 - 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
 - 01-10delphi制作wav文件的方法
 - 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
 - 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
 - 04-02jquery與jsp,用jquery
 - 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
 


