English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
C#3.0 (.NET 3.5)引入了lambda表达式以及LINQ。lambda表达式是使用某些特殊语法表示匿名方法的一种较短方法。
例如,采用以下匿名方法检查学生是否为青少年:
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
Lambda-Ausdrücke in C# und VB.Net können wie folgt verwendet werden, um die obigen anonymen Methoden darzustellen:
s => s.Age 12 && s.Age < 20
Function(s) s.Age 12 And s.Age < 20
Lassen Sie uns sehen, wie der Lambda-Ausdruck aus der folgenden anonymen Methode abgeleitet wird.
delegate(Student s) { return s.Age > } 12 && s.Age < 20; };
Lambda-Ausdrücke wurden durch Entfernen des Delegaten-Schlüsselworts und der Parameter-Typen und Hinzufügen des Lambda-Operators => aus anonymen Methoden abgeleitet.
Dieser Lambda-Ausdruck ist absolut gültig, aber wenn es nur einen Rückgabewert gibt, ist es nicht erforderlich, Klammern, return und Semikolons zu verwenden. Daher können wir es löschen.
Außerdem können Sie die Klammern () löschen, wenn nur ein Parameter vorhanden ist.
daher haben wir den Lambda-Ausdruck: s => s.Age > 12 && s.Age < 20, wobeisSind die Parameter:=>Ist der Lambda-Operator:s.Age > 12 && s.Age < 20Ist der Ausdruckskörper:
Wir können den Weg, wie wir Lambda-Ausdrücke in VB.Net erhalten, wie folgt schreiben:
Der Aufruf eines Lambda-Ausdrucks ist gleich dem Aufruf eines Delegaten mit Klammern
Hinweis: VB.Net unterstützt den Lambda-Operator => nicht
Wenn Sie mehrere Parameter übergeben müssen, können Sie die Parameter in Klammern setzen, wie folgt:
Beispiel: Mehrere Parameter in Lambda-Ausdrücken in C#
(s, youngAge) => s.Age >= youngage;
Wenn die Parameter-Ausdrücke nicht klar genug sind, können Sie auch den Typ jedes Parameters angeben:
(Student s, int youngAge) => s.Age >= youngage;Beispiel: Mehrere Parameter in Lambda-Ausdrücken in VB.Net
Function(s, youngAge) s.Age >= youngAge
In einem Lambda-Ausdruck muss nicht mindestens ein Parameter vorhanden sein. Ein Lambda-Ausdruck kann auch ohne Parameter angegeben werden.
() => Console.WriteLine("Parameterloser Lambda-Ausdruck")
Um mehrere Anweisungen im Body zu enthalten, können Sie den Ausdruck in Klammern setzen:}}
(s, youngAge) =>{ Console.WriteLine("Lambda-Ausdrücke mit mehreren Anweisungen im Body"); Return s.Age >= youngAge;}
Function(s, youngAge) Console.WriteLine("Lambda-Ausdrücke mit mehreren Anweisungen im Body") Return s.Age >= youngAge End Function
Sie können eine Variable im Ausdrucksbody deklarieren, um sie überall im Ausdrucksbody zu verwenden, wie folgt:
s => { int youngAge = 18; Console.WriteLine("Lambda-Ausdrücke mit mehreren Anweisungen im Body"); return s.Age >= youngAge; }
Function(s) Dim youngAge As Integer = 18 Console.WriteLine("Lambda-Ausdrücke mit mehreren Anweisungen im Body") Return s.Age >= youngAge End Function
Lambda-Ausdrücke können auch zugewiesen werden an eingebettete Delegaten wie Func, Action und Predicate.
Lambda-Ausdrücke können zugewiesen werden an den Delegatentyp Func<in T, out TResult>. Der letzte Parameter-Typ im Func-Delegaten ist der Rückgabetyp, die übrigen Parameter sind die Eingangsparameter.Besuchen Sie den Teil der C#-Tutorials über die Func-Delegierten, um mehr Informationen zu erhalten.
Betrachten Sie die folgenden Lambda-Ausdrücke, um zu verstehen, ob ein Student ein Teenager ist.
Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20; Student std = new Student() { age = 21 }; bool isTeen = isStudentTeenAger(std);// Rückgabe 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) // gibt false zurück
Im obigen Beispiel erwartet der Func-Delegat den ersten Eingangsparameter vom Typ Student und gibt einen Boolean-Wert zurück. Lambda-Ausdruck s => s.age > 12 && s.age < 20 erfüllt die Anforderungen des Func <Student, bool>-Delegaten, wie folgt:
Der gezeigte Func <>-Delegat wird zu einer Funktion wie folgt.
bool isStudentTeenAger(Student s) { return s.Age > 12 && s.Age < 20; }
unterschiedlich von Func-DelegatenAction-Delegatkönnen nur Eingangsparameter haben. Verwenden Sie den Action-Delegat-Typ, wenn Sie keine Werte von einem Lambda-Ausdruck zurückgeben müssen.
Action<Student> PrintStudentDetail = s => Console.WriteLine("Name: {0}, Alter: ",1}, s.StudentName, s.Age); Student std = new Student() { StudentName = "Bill", Age =21}; PrintStudentDetail(std);//Ausgabe: Name: Bill, Alter: 21
Dim printStudentDetail As Action(Of Student) = Sub(s) Console.WriteLine("Name: {0}, Alter: ",1}, s.StudentName, s.Age) Dim stud As New Student With {.StudentName = "Bill", .Age = 21} printStudentDetail(stud)//Ausgabe: Name: Bill, Alter: 21
In der Regel werden Lambda-Ausdrücke zusammen mit LINQ-Abfragen verwendet. Enоминаle statische Klassen umfassen die erweiterten Methoden IEnumerable<T>wheres, die Func<TSource,bool> akzeptieren. Daher muss die gesammelte Where()erweiterte Methode IEnumerable<Student> durch Func<Student,bool> wie folgt verwendet werden:
因此,现在,您可以使用Where()如下所示的方法语法将分配给Func委托的lambda表达式传递给扩展方法:
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中遵循相同的方法来传递Func委托。
Lambda表达式是表示匿名方法的简写方法。
Lambda表达式语法: 参数 => 表达式主体
Lambda表达式可以具有零参数。
Lambda表达式的括号()中可以有多个参数。
Lambda表达式可以在大括号{}中的主体表达式中包含多个语句。
Lambda表达式可以分配给Func,Action或Predicate委托。
可以以类似于委托的方式调用Lambda Expression。