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
Vous pouvez représenter les méthodes anonymes mentionnées précédemment à l'aide des expressions Lambda en C# et VB.Net, comme suit :
s => s.Age > 12 && s.Age < 20
Function(s) s.Age > 12 And s.Age < 20
Voyons comment l'expression lambda évolue à partir de la méthode anonyme suivante.
delegate(Student s) { return s.Age > ; } 12 && s.Age < 20; ;
L'expression lambda est apparue en supprimant le mot-clé delegate et le type de paramètre de la méthode anonyme et en ajoutant l'opérateur lambda =>
L'expression lambda ci-dessus est absolument valable, mais si nous avons une seule instruction de retour, nous n'avons pas besoin de accolades, de mot-clé return et de point-virgule. Par conséquent, nous pouvons le supprimer.
De plus, si il n'y a qu'un seul paramètre, vous pouvez supprimer les parenthèses ()
Donc, nous avons l'expression lambda : s => s.Age > 12 && s.Age < 20 OùsC'est le paramètre ,=>C'est l'opérateur lambda ,s.Age > 12 && s.Age < 20C'est le corps de l'expression :
Nous pouvons écrire ainsi pour obtenir une expression lambda dans VB.Net :
La manière de faire appel à une expression lambda est la même que pour l'appel d'une délégation avec des parenthèses ()
Remarque : VB.Net ne prend pas en charge l'opérateur lambda =>
Si vous devez transmettre plusieurs paramètres, vous pouvez les encadrer de parenthèses, comme suit :
Exemple : Spécification de plusieurs paramètres dans une expression Lambda C#
(s, youngAge) => s.Age >= youngage;
Si l'expression des paramètres n'est pas claire, vous pouvez également indiquer le type de chaque paramètre :
(Student s, int youngAge) => s.Age >= youngage;Exemple : Spécification de plusieurs paramètres dans une expression Lambda VB.Net
Function(s, youngAge) s.Age >= youngAge
Il n'est pas nécessaire d'avoir au moins un paramètre dans l'expression lambda. L'expression lambda peut également être définie sans aucun paramètre.
() => Console.WriteLine("Expression lambda sans paramètres")
If you want to include multiple statements in the body, enclose the expression in curly braces:
(s, youngAge) =>{ Console.WriteLine("Lambda expression containing multiple statements in the body"); Return s.Age >= youngAge;}
Function(s, youngAge) Console.WriteLine("Lambda expression containing multiple statements in the body") Return s.Age >= youngAge End Function
You can declare a variable in the expression body to use it anywhere in the expression body, as shown below:
s => { int youngAge = 18; Console.WriteLine("Lambda expression containing multiple statements in the body"); return s.Age >= youngAge; }
Function(s) Dim youngAge As Integer = 18 Console.WriteLine("Lambda expression containing multiple statements in the body") Return s.Age >= youngAge End Function
Lambda expressions can also be assigned to built-in delegates such as Func, Action, and Predicate.
You can assign a lambda expression to the Func<in T, out TResult> delegate type. The last parameter type in the Func delegate is the return type, and the rest are input parameters.Access the Func delegate section of the C# tutorial for more information.
Consider the following lambda expression to understand if the student is a teenager.
Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20; Student std = new Student() { age = 21 }; bool isTeen = isStudentTeenAger(std);// Return 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) // retourne false
Dans cet exemple, le délégué Func attend le premier paramètre d'entrée de type Student et retourne un type booléen. L'expression lambda s => s.age > 12 && s.age < 20 répond aux exigences du délégué Func<Student, bool>, comme suit :
Le délégué Func <> présenté précédemment deviendra une fonction telle que suivante.
bool isStudentTeenAger(Student s) { return s.Age > 12 && s.Age < 20; }
Contrairement au délégué Func,Action déléguéLes délégués Action peuvent ne pas avoir de paramètres d'entrée. Utilisez le type de délégué Action lorsque vous ne souhaitez pas retourner aucune valeur à partir de l'expression lambda.
Action<Student> PrintStudentDetail = s => Console.WriteLine("Nom : {0}, Âge : ", s.StudentName, s.Age)1} Student std = new Student() { StudentName = "Bill", Age =21}; PrintStudentDetail(std);//Sortie : Nom : Bill, Âge : 21
Dim printStudentDetail As Action(Of Student) = Sub(s) Console.WriteLine("Nom : {0}, Âge : ", s.StudentName, s.Age)1} Dim stud As New Student With {.StudentName = "Bill", .Age = 21} printStudentDetail(stud)//Sortie : Nom : Bill, Âge : 21
En règle générale, les expressions lambda sont utilisées conjointement avec les requêtes LINQ. Les classes statiques énumérables incluent des méthodes d'extension telles que IEnumerable<T> où accepte Func<TSource, bool>. Par conséquent, l'extension Where() de IEnumerable<Student> nécessite Func<Student, bool>, comme indiqué ci-dessous :
因此,现在,您可以使用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。