English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
C#3.0 (.NET 3.5)Introduziu expressões lambda e LINQ. A expressão lambda é uma forma mais curta de representar métodos anônimos usando uma sintaxe especial.
Por exemplo, use o seguinte método anônimo para verificar se um aluno é 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
Pode-se usar expressões lambda no C# e VB.Net para representar o método anônimo acima, conforme exemplo a seguir:
s => s.Age 12 && s.Age < 20
Function(s) s.Age 12 And s.Age < 20
Vamos ver como a expressão lambda evoluiu a partir do seguinte método anônimo.
delegate(Student s) { return s.Age >} 12 && s.Age < 20; };
A expressão lambda evoluiu a partir do método anônimo, removendo a palavra-chave delegate e o tipo de parâmetro e adicionando o operador lambda =>.
A expressão lambda acima é absolutamente válida, mas se houver apenas uma linha de retorno, não é necessário usar chaves, return e ponto e vírgula. Portanto, podemos removê-lo.
Além disso, se houver apenas um parâmetro, os parênteses () podem ser removidos.
Portanto, obtemos a expressão lambda: s => s.Age > 12 && s.Age < 20 OndesSão os parâmetros,=>É o operador lambda,s.Age > 12 && s.Age < 20É o corpo da expressão:
A maneira como obtemos expressões lambda no VB.Net pode ser escrita da seguinte forma:
A forma de chamar uma expressão lambda é a mesma que a de chamar um delegate com parênteses ()
Atenção: VB.Net não suporta o operador lambda =>
Se precisar passar múltiplos parâmetros, você pode coloca-los entre parênteses, conforme exemplo a seguir:
Exemplo: Especificando múltiplos parâmetros em expressão lambda C#
(s, youngAge) => s.Age >= youngage;
Se a expressão de parâmetro não estiver clara o suficiente, você pode fornecer o tipo de cada parâmetro:
(Student s, int youngAge) => s.Age >= youngage;Exemplo: Especificando múltiplos parâmetros em expressão lambda VB.Net
Function(s, youngAge) s.Age >= youngAge
Não é necessário que uma expressão lambda tenha pelo menos um parâmetro. A expressão lambda também pode ser especificada sem qualquer parâmetro.
() => Console.WriteLine("Expressão lambda sem parâmetros")
Se desejar incluir múltiplas instruções no corpo, pode-se envolver a expressão entre chaves:}}
(s, youngAge) =>{ Console.WriteLine("Expressão lambda com múltiplas instruções no corpo"); Return s.Age >= youngAge;}
Function(s, youngAge) Console.WriteLine("Expressão lambda com múltiplas instruções no corpo"); Return s.Age >= youngAge End Function
Pode-se declarar uma variável no corpo da expressão para usá-la em qualquer lugar do corpo da expressão, conforme exemplo a seguir:
s => { int youngAge = 18; Console.WriteLine("Expressão lambda com múltiplas instruções no corpo"); return s.Age >= youngAge; }
Function(s) Dim youngAge As Integer = 18 Console.WriteLine("Expressão lambda com múltiplas instruções no corpo"); Return s.Age >= youngAge End Function
Expressões lambda também podem ser atribuídas a delegados integrados, como Func, Action e Predicate.
Pode-se atribuir uma expressão lambda ao tipo de delegate Func<in T, out TResult>. O tipo do último parâmetro do delegate Func é o tipo de retorno, e os outros parâmetros são os parâmetros de entrada.Acesse a parte sobre delegate Func do tutorial C# para obter mais informações.
Considere a seguinte expressão lambda para entender se o estudante é adolescente.
Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20; Student std = new Student() { age = 21 }; bool isTeen = isStudentTeenAger(std);// Retorna 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) // retorna false
No exemplo acima, o delegado Func espera o primeiro parâmetro de entrada do tipo Student e retorna um valor booleano. expressão lambda s => s.age > 12 && s.age < 20 satisfaz os requisitos do delegado Func<Student, bool>, conforme mostrado a seguir:
O delegado Func <> mostrado acima se tornará uma função conforme mostrado a seguir.
bool isStudentTeenAger(Student s) { return s.Age > 12 && s.Age < 20; }
Diferente do delegado Func,Delegado ActionPode ter apenas um parâmetro de entrada. Quando você não precisa retornar nenhum valor da expressão lambda, use o tipo de delegado Action.
Action<Student> PrintStudentDetail = s => Console.WriteLine("Nome: {0}, Idade: ",1}, s.StudentName, s.Age); Student std = new Student() { StudentName = "Bill", Age =21}; PrintStudentDetail(std);//Saída: Nome: Bill, Idade: 21
Dim printStudentDetail As Action(Of Student) = Sub(s) Console.WriteLine("Nome: {0}, Idade: ",1}, s.StudentName, s.Age) Dim stud As New Student With {.StudentName = "Bill", .Age = 21} printStudentDetail(stud)//Saída: Nome: Bill, Idade: 21
Normalmente, as expressões lambda são usadas juntamente com consultas LINQ. As classes estáticas enumeráveis incluem os métodos de extensão IEnumerable<T> onde Func<TSource, bool> é aceito. Portanto, o método de extensão Where() de IEnumerable<Student> precisa ser passado Func<Student, bool>, conforme mostrado a seguir:
Portanto, agora, você pode passar a expressão lambda atribuída ao delegado Func para o método de extensão Where() da seguinte maneira:
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;
Você pode seguir a mesma abordagem no VB.Net para passar o delegado Func.
Expressão Lambda é uma abreviação para método de método anônimo.
Sintaxe da Expressão Lambda: Parâmetro => corpo da expressão
Expressões Lambda podem ter zero parâmetros.
Os parênteses () de uma Expressão Lambda podem conter vários parâmetros.
Expressões Lambda podem conter várias instruções no corpo entre chaves {}.
Expressões Lambda podem ser atribuídas a delegados Func, Action ou Predicate.
Pode chamar uma Expressão Lambda de maneira semelhante a um delegado.