C#3.0(.NET 3.5)引入了lambda表達(dá)式以及 LINQ。lambda表達(dá)式是使用某些特殊語(yǔ)法表示匿名方法的一種較短方法。
例如,采用以下匿名方法檢查學(xué)生是否為青少年:
delegate(Student s) { return s.Age > 12 && s.Age < 20; };
Dim isStudentTeenAger = Function(s As Student) As Boolean Return s.Age > 12 And s.Age < 20 End Function
可以使用C#和VB.Net中的Lambda表達(dá)式來(lái)表示上述匿名方法,如下所示:
s => s.Age > 12 && s.Age < 20
Function(s) s.Age > 12 And s.Age < 20
讓我們看看lambda表達(dá)式是如何從以下匿名方法演變而來(lái)的。
delegate(Student s) { return s.Age > 12 && s.Age < 20; };
Lambda表達(dá)式是通過(guò)首先刪除委托關(guān)鍵字和參數(shù)類型并添加lambda運(yùn)算符=>從匿名方法演變而來(lái)的。
上面的lambda表達(dá)式絕對(duì)有效,但是如果我們只有一個(gè)返回值的語(yǔ)句,則不需要花括號(hào),return和分號(hào)。因此我們可以刪除它。
另外,如果只有一個(gè)參數(shù),則可以刪除括號(hào)()。
因此,我們得到了lambda表達(dá)式:s => s.Age > 12 && s.Age < 20 其中s是參數(shù),=>是lambda運(yùn)算符,s.Age > 12 && s.Age < 20是表達(dá)式主體:
我們?cè)赩B.Net中獲得lambda表達(dá)式的方式可以如下編寫(xiě):
lambda表達(dá)式的調(diào)用方式與使用()的委托調(diào)用方式相同。
注意:VB.Net不支持lambda運(yùn)算符=>
如果您需要傳遞多個(gè)參數(shù),則可以將參數(shù)括在括號(hào)中,如下所示:
示例:在Lambda表達(dá)式C#中指定多個(gè)參數(shù)
(s, youngAge) => s.Age >= youngage;
如果覺(jué)得參數(shù)表達(dá)不清,您還可以給出每個(gè)參數(shù)的類型:
(Student s,int youngAge) => s.Age >= youngage;示例:在Lambda表達(dá)式中指定多個(gè)參數(shù)VB.Net
Function(s, youngAge) s.Age >= youngAge
lambda表達(dá)式中不必至少有一個(gè)參數(shù)。lambda表達(dá)式也可以不帶任何參數(shù)來(lái)指定。
() => Console.WriteLine("無(wú)參數(shù) lambda 表達(dá)式")
如果要在主體中包含多個(gè)語(yǔ)句,可以將表達(dá)式用大括號(hào)括起來(lái):
(s, youngAge) =>{ Console.WriteLine("在主體中包含多個(gè)語(yǔ)句的Lambda表達(dá)式"); Return s.Age >= youngAge;}
Function(s , youngAge) Console.WriteLine("在主體中包含多個(gè)語(yǔ)句的Lambda表達(dá)式") Return s.Age >= youngAge End Function
您可以在表達(dá)式主體中聲明一個(gè)變量,以在表達(dá)式主體中的任何地方使用它,如下所示:
s => { int youngAge = 18; Console.WriteLine("在主體中包含多個(gè)語(yǔ)句的Lambda表達(dá)式"); return s.Age >= youngAge; }
Function(s) Dim youngAge As Integer = 18 Console.WriteLine("在主體中包含多個(gè)語(yǔ)句的Lambda表達(dá)式") Return s.Age >= youngAge End Function
Lambda表達(dá)式也可以分配給內(nèi)置委托,例如Func,Action和Predicate。
可以將lambda表達(dá)式分配給Func<in T, out TResult>委托類型。Func委托中的最后一個(gè)參數(shù)類型是返回類型,其余參數(shù)是輸入?yún)?shù)。訪問(wèn)C#教程的Func委托部分以了解更多信息。
考慮以下lambda表達(dá)式,以了解學(xué)生是否是青少年。
Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20; Student std = new Student() { age = 21 }; bool isTeen = isStudentTeenAger(std);// 返回false
Dim isStudentTeenAger As Func(Of Student, Boolean) = Function(s) s.Age > 12 And s.Age < 20 Dim stud As New Student With {.Age = 21} Dim isTeen As Boolean = isStudentTeenAger(stud) // 返回 false
在上面的示例中,F(xiàn)unc委托期望第一個(gè)輸入?yún)?shù)為Student類型,而返回類型為布爾值。lambda表達(dá)式 s => s.age > 12 && s.age < 20滿足Func <Student,bool>委托要求,如下所示:
上面顯示的Func <>委托將變成一個(gè)如下所示的函數(shù)。
bool isStudentTeenAger(Student s) { return s.Age > 12 && s.Age < 20; }
與Func委托不同,Action委托只能具有輸入?yún)?shù)。當(dāng)您不需要從lambda表達(dá)式返回任何值時(shí),請(qǐng)使用Action委托類型。
Action<Student> PrintStudentDetail = s => Console.WriteLine("Name: {0}, Age: {1} ", s.StudentName, s.Age); Student std = new Student(){ StudentName = "Bill", Age=21}; PrintStudentDetail(std);//輸出: Name: Bill, Age: 21
Dim printStudentDetail As Action(Of Student) = Sub(s) Console.WriteLine("Name: {0}, Age: {1} ", s.StudentName, s.Age) Dim stud As New Student With {.StudentName = "Bill", .Age = 21} printStudentDetail(stud)//輸出: Name: Bill, Age: 21
通常,lambda表達(dá)式與LINQ查詢一起使用??擅杜e的靜態(tài)類包括其中的擴(kuò)展方法IEnumerable<T>wheres接受Func<TSource,bool>。因此,收集的Where()擴(kuò)展方法IEnumerable<Student>需要通過(guò)Func<Student,bool>,如下所示:
因此,現(xiàn)在,您可以使用Where()如下所示的方法語(yǔ)法將分配給Func委托的lambda表達(dá)式傳遞給擴(kuò)展方法:
IList<Student> studentList = new List<Student>(){...}; Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20; var teenStudents = studentList.Where(isStudentTeenAger).ToList<Student>();
IList<Student> studentList = new List<Student>(){...}; Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20; var teenStudents = from s in studentList where isStudentTeenAger(s) select s;
您可以在VB.Net中遵循相同的方法來(lái)傳遞Func委托。
Lambda表達(dá)式是表示匿名方法的簡(jiǎn)寫(xiě)方法。
Lambda表達(dá)式語(yǔ)法: 參數(shù) => 表達(dá)式主體
Lambda表達(dá)式可以具有零參數(shù)。
Lambda表達(dá)式的括號(hào)()中可以有多個(gè)參數(shù)。
Lambda表達(dá)式可以在大括號(hào){}中的主體表達(dá)式中包含多個(gè)語(yǔ)句。
Lambda表達(dá)式可以分配給Func,Action或Predicate委托。
可以以類似于委托的方式調(diào)用Lambda Expression。