Lambda表達式來源於數學家Alonzo Church等人在1920~1930期間發明的Lambad積分。Lambda積分是用於表示函數的一套系統,它使用希臘字母Lambda( λ )來表示無名函數。express
C# 3.0引入了Lambda表達式,它是一種簡化的匿名函數,可用於建立委託或表達式目錄樹。你也能夠將 Lambda 表達式做爲參數進行傳遞,或者將它做用於函數調用值調用後返回的一個函數來使用。api
它的語法形式是: 輸入參數 => 表達式或語句塊 即運算符的左邊是輸入參數(若是有),右邊是表達式或語句塊。 ( 「 => 」 讀做 「 goes to 」 )異步
表達式位於 => 運算符右側的 lambda 表達式稱爲「表達式 lambda」。 表達式 Lambda 會返回表達式的結果,並採用如下基本形式:async
(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表達式的參數列表要點以下:ide
♥ Lambda表達式參數列表中的參數必須在參數數量、類型和位置上與委託相匹配函數
♥ 表達式參數列表中的參數不必定須要包含類型(隱式類型),除非委託有ref或out參數----此時必須註明類型(顯式類型)ui
♥ 若是隻有一個參數,而且是隱式類型的,周圍的圓括號能夠被省略,不然必須有括號spa
♥ 若是沒有參數,必須使用一組空的圓括號code
當lambda表達式中,有多個語句時,寫成以下形式:orm
(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和異步中使用它
引用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 } }
你能夠使用異步 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的知識,能夠參閱我之前寫過的博客