C#3.0(.NET3.5)中引入了Lambda表達式和LINQ。Lambda表達式是使用一些特殊語法表示匿名方法的較短方法。
最基本的Lambda表達式語法如下:
(參數列表)=>{方法體}
說明:
1、參數列表中的參數類型可以是明確類型或者推斷類型。
2、如果是推斷類型,則參數的數據類型將由編輯器根據上下文自動推斷出來。
讓我們看看Lambda表達式是如何從匿名方法演變而來的。
相關示例:
1 delegate(int item) { return item % 2 == 0; };
1、Lambda表達式從匿名方法演變,首先刪除delegate關鍵字和參數類型並添加Lambda運算符=>,演變后的代碼如下:
1 (item)=>{return item % 2 == 0;};
2、如果我們只有一個返回值的語句,那么我們不需要花括號、返回和分號,所以我們可以去掉這些符號,演變后的代碼如下:
1 (item)=>item %2 == 0;
3、如果我們只有一個參數,我們也可以刪除(),代碼如下:
1 item=>item %2 == 0;
因此,我們得到如下所示的Lambda表達式:
item => item % 2 == 0
其中item是參數,=>是Lambda運算符,item % 2 == 0是正文表達式。
二、具有多個參數的Lambda表達式
如果需要傳遞多個參數,那么必須將參數括在括號內,如下所示:
1 (ints, item) => ints.Contains(item);
如果不想使用推斷類型,那么可以給出每個參數的類型,如下所示:
1 (int[] ints, int item) => ints.Contains(item)
三、不帶任何參數的Lambda表達式
在Lambda表達式中可以沒有參數,如下所示:
1 () => Console.WriteLine("這是一個不帶任何參數的Lambda表達式");
四、正文表達式中有多條語句
在前面講過,如果正文表達式有一個語句,那么可以去掉方法體外面的大括號。如果正文表達式中有多條語句,那么必須用大括號將正文表達式括起來,如下所示:
(ints, item) => { Console.WriteLine("這是包含多條語句的Lambda表達式"); return ints.Contains(item); };
五、表達式中的局部變量
你可以在表達式的主體中聲明一個變量,以便在表達式主體的任何位置使用它,如下所示:
1 ints => 2 { 3 int item = 10; 4 return ints.Contains(item); 5 };
六、Lambda表達式中的內置泛型委托
1、Func委托
當你想從lambda表達式返回一些東西時,使用Func <> delegate。
其中T是輸入參數的類型,TResult是返回類型。
示例代碼如下:
1 Func<int[], bool> isContains = p => p.Equals(10); 2 int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 }; 3 bool isEquals = isContains(ints);
在上面的例子中,Func委托期望第一個輸入參數是int[]類型,返回類型是boolean。Lambda表達式是p => p.Equals(10)。
2、Action委托
與Func委托不同,Action委托只能有輸入參數。 當不需要從lambda表達式返回任何值時,請使用Action委托類型。
示例代碼如下:
1 Action<int[]> PrintItem = p => 2 { 3 foreach (int item in p) 4 { 5 Console.WriteLine(item); 6 } 7 }; 8 int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 }; 9 PrintItem(ints);
七、在LINQ中使用Lambda表達式
通常情況下,Lambda表達式與LINQ查詢一起使用。枚舉靜態類包括接受Func <TSource,bool>的IEnumerable <T>的Where擴展方法。IEnumerable <Int>集合的Where()擴展方法需要傳遞Func <Student,bool>,如下所示:
現在,您可以將分配給Func委托的lambda表達式傳遞給方法語法中的Where()擴展方法,如下所示:
1 Func<int, bool> isContains = p =>p.Equals (4); 2 int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 }; 3 var result = ints.Where(isContains).ToList();
八、Lambda表達式要點總結
1、Lambda表達式是一種表示匿名方法的更短的方法。
2、Lambda表達式語法:parameters =>正文表達式
3、Lambda表達式可以在()中具有零個或多個參數。
4、Lambda表達式可以在大括號{}中的正文表達式中有一條或多條語句。
5、Lambda表達式可以分配給Func,Action或Predicate委托。
6、Lambda表達式可以以類似的方式調用委托。