English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

LINQ Lambda表达式

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 =>

Expression lambda venue d'une méthode anonyme

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 ()

Expression lambda venue d'une méthode anonyme

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 :

Structure de l'expression Lambda dans C#

Nous pouvons écrire ainsi pour obtenir une expression lambda dans VB.Net :

Structure de l'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 =>

Expression lambda avec plusieurs paramètres

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

Expression lambda sans paramètres

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")

Le corps d'expression Lambda contient plusieurs instructions

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

Declaring local variables in Lambda expression body

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.

Assigning a Lambda expression to a delegate

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 :

Func délégué avec une expression lambda

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;
}

Action délégué

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

Les expressions lambda dans les requêtes LINQ

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委托参数

因此,现在,您可以使用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委托。

要记住的要点

  1. Lambda表达式是表示匿名方法的简写方法。

  2. Lambda表达式语法: 参数 => 表达式主体

  3. Lambda表达式可以具有零参数。

  4. Lambda表达式的括号()中可以有多个参数。

  5. Lambda表达式可以在大括号{}中的主体表达式中包含多个语句。

  6. Lambda表达式可以分配给Func,Action或Predicate委托。

  7. 可以像委托一样调用Lambda Expression。