一、簡介
Lambda表達式來源於數學家Alonzo Church等人在1920~1930期間發明的Lambad積分。Lambda積分是用於表示函數的一套系統,它使用希臘字母Lambda( λ )來表示無名函數。
C# 3.0引入了Lambda表達式,它是一種簡化的匿名函數,可用於創建委托或表達式目錄樹。你也可以將 Lambda 表達式作為參數進行傳遞,或者將它作用於函數調用值調用后返回的一個函數來使用。
二、基礎
它的語法形式是: 輸入參數 => 表達式或語句塊 即運算符的左邊是輸入參數(如果有),右邊是表達式或語句塊。 ( “ => ” 讀作 “ goes to ” )
2.1 表達式Lambda
表達式位於 => 運算符右側的 lambda 表達式稱為“表達式 lambda”。 表達式 Lambda 會返回表達式的結果,並采用以下基本形式:
(input parameters) => expression
delegate int myDel(int x,int y); //聲明委托 class Program { static void Main(string[] args) { myDel del = (x,y) => x+y; //返回x+y的結果
Console.WriteLine("values {0}",del(5,8)); //輸出13
Console.ReadKey();
}
}
有關Lambda表達式的參數列表要點如下:
♥ Lambda表達式參數列表中的參數必須在參數數量、類型和位置上與委托相匹配
♥ 表達式參數列表中的參數不一定需要包含類型(隱式類型),除非委托有ref或out參數----此時必須注明類型(顯式類型)
♥ 如果只有一個參數,並且是隱式類型的,周圍的圓括號可以被省略,否則必須有括號
♥ 如果沒有參數,必須使用一組空的圓括號
2.2 語句Lambda
當lambda表達式中,有多個語句時,寫成如下形式:
(input parameters) => { statement; }
delegate int myDel(string str); class Program { static void Main(string[] args) { myDel del = (str) => { Console.WriteLine("hello {0}",str); return 123; }; Console.WriteLine("values {0}",del("world")); Console.ReadKey(); } }
三、運用
知道了Lamda的基本用法,下面看看怎么在LINQ和異步中使用它
3.1 LINQ查詢中使用Lambda表達式參數的示例
引用MSDN中的例子。下面的示例演示如何通過 Enumerable.Where 標准查詢運算符,在基於方法的查詢中使用 lambda 表達式。 請注意,此示例中的 Where 方法具有一個 Func<TResult> 委托類型的輸入參數,該委托采用整數作為輸入並返回一個布爾值。 Lambda 表達式可以轉換為該委托。
class SimpleLambda { static void Main() { // Data source. int[] scores = { 90, 71, 82, 93, 75, 82 }; // The call to Count forces iteration of the source int highScoreCount = scores.Where(n => n > 80).Count(); Console.WriteLine("{0} scores are greater than 80", highScoreCount); // Outputs: 4 scores are greater than 80 } }
3.2 使用異步Lambda表達式
你可以使用異步 lambda 添加事件處理程序。 若要添加此處理程序,請在 lambda 參數列表前添加一個 async
修飾符,如下例,lambda表達式被注冊為一個按鈕點擊事件的事件處理程序。
public partial class Form1 : Form { public Form1() { InitializeComponent(); button1.Click += async (sender, e) => //異步Lambda表達式 { // ExampleMethodAsync returns a Task. await ExampleMethodAsync(); textBox1.Text += "\nControl returned to Click event handler.\n"; }; } async Task ExampleMethodAsync() { // The following line simulates a task-returning asynchronous process. await Task.Delay(1000); } }
有關異步和LINQ的知識,可以參閱我以前寫過的博客