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

Expressões Lambda LINQ

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

Expressão lambda proveniente de métodos anônimos

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.

Expressão lambda proveniente de métodos anônimos

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:

Estrutura da expressão lambda no C#

A maneira como obtemos expressões lambda no VB.Net pode ser escrita da seguinte forma:

Estrutura da expressão lambda no VB.Net

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

Expressão lambda com múltiplos parâmetros

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

Expressão lambda sem parâmetros

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

Corpo de expressão Lambda com várias linhas

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

Declaração de variável local no corpo da expressão lambda

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.

Atribuição de expressão lambda a delegate

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:

Delegado Func com expressão lambda

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

Delegado Action

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

Expressões lambda em consultas LINQ

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:

Parâmetro Func no método de extensão Where

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.

Ponto a ser lembrado

  1. Expressão Lambda é uma abreviação para método de método anônimo.

  2. Sintaxe da Expressão Lambda: Parâmetro => corpo da expressão

  3. Expressões Lambda podem ter zero parâmetros.

  4. Os parênteses () de uma Expressão Lambda podem conter vários parâmetros.

  5. Expressões Lambda podem conter várias instruções no corpo entre chaves {}.

  6. Expressões Lambda podem ser atribuídas a delegados Func, Action ou Predicate.

  7. Pode chamar uma Expressão Lambda de maneira semelhante a um delegado.