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

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.

Lambda-Ausdrücke aus anonymen Methoden

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.

Lambda-Ausdrücke aus anonymen Methoden

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:

Struktur des Lambda-Ausdrucks in C#

Wir können den Weg, wie wir Lambda-Ausdrücke in VB.Net erhalten, wie folgt schreiben:

Struktur des Lambda-Ausdrucks in VB.Net

Der Aufruf eines Lambda-Ausdrucks ist gleich dem Aufruf eines Delegaten mit Klammern

Hinweis: VB.Net unterstützt den Lambda-Operator => nicht

Lambda-Ausdruck mit mehreren Parametern

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

Lambda-Ausdruck ohne Parameter

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

Lambda-Ausdruckskörper mit mehreren Anweisungen

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

Lokale Variablen in Lambda-Ausdrucksbody deklarieren

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 werden an Delegierten zugewiesen

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:

Func-Delegat mit Lambda-Ausdruck

Der gezeigte Func <>-Delegat wird zu einer Funktion wie folgt.

bool isStudentTeenAger(Student s)
{
    return s.Age > 12 && s.Age < 20;
}

Action-Delegat

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

Lambda-Ausdrücke in LINQ-Abfragen

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

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