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


閱讀排行
本欄相關
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關于ASP網頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10C#中split用法實例總結
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 04-02jquery與jsp,用jquery
- 01-11ajax實現(xiàn)頁面的局部加載