English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
C# 3.0 (.NET 3.5) ha introdotto le espressioni lambda e LINQ. Le espressioni lambda sono un modo più breve per rappresentare i metodi anonimi utilizzando una grammatica speciale.
Ad esempio, utilizzare il seguente metodo anonimo per verificare se lo studente è un adolescente:
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
È possibile rappresentare i metodi anonimi sopra descritti utilizzando le espressioni lambda in C# e VB.Net, come mostrato di seguito:
s => s.Age > 12 && s.Age < 20
Function(s) s.Age > 12 And s.Age < 20
Vediamo come l'espressione lambda è evoluta dal seguente metodo anonimo.
delegate(Student s) { return s.Age > 12 && s.Age < 20; };
L'espressione lambda è evoluta dall'anonima metodo rimuovendo la parola chiave delegato e il tipo dei parametri e aggiungendo l'operatore lambda =>.
L'espressione lambda sopra indicata è assolutamente valida, ma se c'è solo una frase di ritorno, non è necessario utilizzare le parentesi graffe, il return e il punto e virgola. Pertanto, possiamo eliminarli.
Inoltre, se c'è solo un parametro, è possibile eliminare le parentesi graffe ()
Dunque, otteniamo l'espressione lambda: s => s.Age > 12 && s.Age < 20 dovesSono i parametri:=>È l'operatore lambda:s.Age > 12 && s.Age < 20È il corpo dell'espressione:
Il modo in cui otteniamo l'espressione lambda in VB.Net può essere così scritto:
Il modo di chiamare l'espressione lambda è lo stesso del chiamare un delegato con parentesi
Attenzione: VB.Net non supporta l'operatore lambda =>
Se avete bisogno di passare più parametri, potete racchiuderli tra parentesi, come nel seguente esempio:
Esempio: Specificare più parametri nell'espressione lambda C#
(s, youngAge) => s.Age >= youngage;
Se pensate che l'espressione dei parametri sia poco chiara, potete anche indicare il tipo di ciascun parametro:
(Student s, int youngAge) => s.Age >= youngage;Esempio: Specificare più parametri nell'espressione lambda VB.Net
Function(s, youngAge) s.Age >= youngAge
Non è necessario che l'espressione lambda abbia almeno un parametro. L'espressione lambda può anche essere specificata senza alcun parametro.
() => Console.WriteLine("Espressione lambda senza parametri")
Se si desidera includere più frasi nel corpo, è possibile racchiudere l'espressione tra parentesi graffe:
(s, youngAge) =>{ Console.WriteLine("Espressione lambda con più statement nel corpo"); Return s.Age >= youngAge;}
Function(s, youngAge) Console.WriteLine("Espressione lambda con più statement nel corpo") Return s.Age >= youngAge End Function
Puoi dichiarare una variabile nell'astrazione dell'espressione per usarla in qualsiasi parte dell'astrazione dell'espressione, come nel seguente esempio:
s => { int youngAge = 18; Console.WriteLine("Espressione lambda con più statement nel corpo"); return s.Age >= youngAge; }
Function(s) Dim youngAge As Integer = 18 Console.WriteLine("Espressione lambda con più statement nel corpo") Return s.Age >= youngAge End Function
Le espressioni lambda possono anche essere assegnate a deleghe innate come Func, Action e Predicate.
Le espressioni lambda possono essere assegnate a tipi di delega Func<in T, out TResult>. Il tipo dell'ultimo parametro della delega Func è il tipo di ritorno, mentre gli altri parametri sono i parametri di input.Visita la sezione deleghe Func del tutorial C# per ulteriori informazioni.
Considera l'espressione lambda seguente per capire se lo studente è adolescente.
Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20; Student std = new Student() { age = 21 }; bool isTeen = isStudentTeenAger(std); // restituisce 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) // restituisce false
Nell'esempio sopra, il delegato Func si aspetta che il primo parametro di input sia di tipo Student e che il tipo di ritorno sia un valore booleano. L'espressione lambda s => s.age > 12 && s.age < 20 soddisfa i requisiti del delegato Func<Student, bool>, come mostrato di seguito:
Il delegato Func <> mostrato sopra diventerà una funzione come segue.
bool isStudentTeenAger(Student s) { return s.Age > 12 && s.Age < 20; }
A differenza del delegato FuncDelega ActionPuò avere solo un parametro di input. Quando non è necessario restituire alcun valore dall'espressione lambda, utilizzare il tipo di delega 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)//Output: 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)//Output: Name: Bill, Age: 21
Di solito, le espressioni lambda vengono utilizzate insieme alle query LINQ. Le classi statiche enumerabili includono i metodi di estensione IEnumerable<T> in cui viene accettato Func<TSource, bool>. Pertanto, l'estensione Where() di IEnumerable<Student> richiede un Func<Student, bool>, come mostrato di seguito:
Dunque, ora puoi passare l'espressione lambda assegnata al delegato Func all'estensione metodo come mostrato di seguito:
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;
Puoi seguire lo stesso metodo per passare il delegato Func in VB.Net.
Le espressioni Lambda sono una sintassi abbreviata per rappresentare metodi anonimi.
Sintassi delle espressioni Lambda: Parametro => corpo dell'espressione
Le espressioni Lambda possono avere zero parametri.
Le parentesi tonde () delle espressioni Lambda possono avere più parametri.
Le espressioni Lambda possono contenere più istruzioni nel corpo dell'espressione tra parentesi graffe {}.
Le espressioni Lambda possono essere assegnate a delegati di tipo Func, Action o Predicate.
Puoi chiamare Lambda Expression in modo simile a un delegato.