Uma expressão Lambda é uma função anônima que você pode usar para criar Delegates ou tipos de árvores de Expressão. São particularmente muito úteis para escrever consultas LINQ.
Para facilitar o entendimento, a expressão lambda é uma espécie de função, porém sem nome. Ela realiza cálculos, filtros e retorna valores ou coleções de valores.
O símbolo “=>” é o operador Lambda, também conhecido como vai para (goes to), e toda expressão precisa dele. Ao criar uma você, devem-se colocar os parâmetros a esquerda do operador (caso haja parâmetros) e do outro lado do bloco coloca-se a expressão ou instrução do. Esse tipo de expressão pode ser atribuído a Delegates.
Abaixo veremos alguns exemplos de expressões lambda para facilitar o entendimento.
Na Listagem 1 um array numérico e deveremos saber quantos números pares tem nesse array.
Listagem 1. Exemplo Expressão lambda
static void Main(string[] args)
{
//Criamos uma array de numeros
int[] numeros = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//utilizamos a função cout com uma expressão lambda como parametro
int qtdPares = numeros.Count(x => x % 2 == 0); // qtdPares = 5
Console.WriteLine("Quantidades de Numeros Pares: {0}",
qtdPares.ToString());
Console.ReadKey();
}
Agora veremos um exemplo criando um delegate na Listagem 2. Imagine que você tem uma situação onde precise passa um valor e receber o quadrado dele.
Listagem 2. Exemplo Expressão lambda com Delegate
delegate float deleg(float i);
static void Main(string[] args)
{
//Criamos uma variavel para receber um valor digitado pelo usuário
float I = float.Parse(Console.ReadLine());
//Criamos uma variavel do tipo delegate que recebe
//a expressão lambda
deleg _Delegate = x => x * x;
float j = _Delegate(I); //j = 25
Console.WriteLine("O Quadrado de {0} é {1}",
I.ToString(), j.ToString());
Console.ReadKey();
}
Porque usar Expressões lambda?
Devemos usar as Expressões lambdas para deixar seu código muito mais simples e legível, tornando-o mais agradável e elegante, principalmente na forma como embarca métodos anônimos ao código.
Expressões lambda com LINQ
Bom agora que já obtivemos uma breve explicação sobre expressões lambda, vamos mostrar sua utilização com LINQ.
LINQ é uma linguagem de consulta que foi introduzida a partir do .Net Framewok 3.5 e é utilizada na manipulação de coleções, sejam elas vindas de um banco de dados, documentos XML, coleções de objetos, etc. Assim, podemos definir o LINQ como uma consulta que não tem dependência da fonte de dados.
Agora vamos criar um cenário para que possamos demonstrar a utilização do LINQ e a melhora quando utilizamos lambda junto a ele. Vamos criar uma lista do tipo pessoa; pessoa é um tipo de dado com as propriedades Nome, Idade, Cidade e Sexo.
Para montarmos esse exemplo, Abra o Visual Studio e crie um novo projeto clicando em File -> New -> Project, conforme a Figura 1.
Figura 1. Criando o projeto.
Na janela seguinte digite “empty” na caixa de pesquisa e selecione BlankSolution. Altere a propriedade Name para Lambda ou para o nome que preferir, conforme mostra a Figura 2.
Figura 2. Novo projeto em Branco.
Se olharmos no Solution Explorer veremos que foi criada uma solução vazia, então agora clique com o botão direito do mouse e escolha Add... e em seguida New Project. Crie um projeto do Tipo Console Application e altere a propriedade Name para Lambda, conforme demonstrado nas Figuras 3 e 4.
Figura 3. Adicionando um novo projeto a Solution.
Figura 4. Criando o projeto Console Application.
Agora vá até o Solution explorer e clique com o botão direito do mouse sobre o projeto Console Application. Escolha a opção Add -> New Item e na janela que irá se abrir escolha a opção Class, alterando a propriedade Name para Pessoa.cs. Agora vamos implementar a classe pessoa, onde a mesma deve ter as propriedades Nome, Idade, Cidade e Sexo e um construtor que recebe essas propriedades, conforme a Listagem 3.
Listagem 3. Criando Classe Pessoa
class Pessoa
{
public String Nome { get; set; }
public int Idade { get; set; }
public String Cidade { get; set; }
public String Sexo { get; set; }
public Pessoa(String _Nome, int _Idade,
String _Cidade, String _Sexo)
{
Nome = _Nome;
Idade = _Idade;
Cidade = _Cidade;
Sexo = _Sexo;
}
public override String ToString()
{
return "Nome: " + Nome + " Idade: " +
Idade.ToString() + " Cidade: " + Cidade + " Sexo: " + Sexo;
}
}
No mesmo arquivo Pessoa.cs vamos também implementar uma classe que é uma lista de pessoa. Essa classe conterá apenas um construtor sem parâmetros que servirá para alimentarmos nossa lista de pessoas, ou seja, ao instanciarmos essa lista ela já estará populada. Observe a Listagem 4.
Listagem 4. Alimentando a Lista de pessoas
class lPessoa : List<Pessoa>
{
public lPessoa()
{
this.Add(new Pessoa("JOSÉ SILVA", 21, "PIRACICABA", "M"));
this.Add(new Pessoa("ADRIANA GOMES", 18, "CURITIBA", "F"));
this.Add(new Pessoa("JOSÉ NOVAES", 17, "CAMPINAS", "M"));
this.Add(new Pessoa("ANDRÉ NEVES", 50, "PIRACICABA", "M"));
this.Add(new Pessoa("JONATHAN SANTOS", 45, "CAMPINAS", "M"));
this.Add(new Pessoa("IVANILDA RIBEIRO", 29, "AMERICANA", "F"));
this.Add(new Pessoa("BRUNA STEVAN", 28, "AMERICANA", "M"));
this.Add(new Pessoa("ANDREIA MARTINS", 22,
"RIO DE JANEIRO", "F"));
this.Add(new Pessoa("ANTONIO DA SILVA", 30,
"POÇOS DE CALDAS", "M"));
this.Add(new Pessoa("JOSEFINO DANTAS", 48,
"CAMPOS DO JORDÃO", "M"));
this.Add(new Pessoa("HELENA MARIA GOMES", 25,
"SÃO PAULO", "F"));
this.Add(new Pessoa("DJONATHAN MASTRODI", 29,
"PIRACICABA", "M"));
this.Add(new Pessoa("BRUNO MARTINO", 55, "AMERICANA", "M"));
this.Add(new Pessoa("ANA MARIA GONÇALVES", 60,
"PRAIA GRANDE", "F"));
this.Add(new Pessoa("MARCELA MARIA RIBEIRO", 85,
"JOAO PESSOA", "F"));
this.Add(new Pessoa("ISABELLA MENDES", 32, "PIRACICABA", "F"));
this.Add(new Pessoa("IGOR MENDES", 22, "CAMPINAS", "M"));
this.Add(new Pessoa("ANTONIO JOSÉ FARIAS", 21,
"RIO DAS PEDRAS", "M"));
this.Add(new Pessoa("JULIO VIEIRA", 19, "ANDRADINA", "M"));
this.Add(new Pessoa("MARIO RIBEIRO ", 13, "LIMEIRA", "M"));
}
}
Agora que já criamos as classes necessárias, veremos a utilização de lambda com LINQ. A cada exemplo mostraremos a forma com e sem lambda para que você possa ver as diferenças entre os dois tipos.
Primeiro vamos utilizar a nossa lista de pessoas, porém deveremos retornar na tela somente as pessoas que a primeira letra do Nome é “A”. Para isso devemos implementar a rotina utilizando Expressões Lambda. Na Listagem 5 você confere o exemplo com lamba e na Listagem 6 sem lambda.
Listagem 5. Exemplo de lambda com LINQ
lPessoa _lPessoa = new lPessoa();
foreach (var item in _lPessoa.Where
(p=>p.Nome.StartsWith("A")))
{
Console.WriteLine(item.ToString());
}
Listagem 6. Exemplo com LINQ
lPessoa _lPessoa = new lPessoa();
var pessoa= from p in _lPessoa
where p.Nome.StartsWith("A")
select p
foreach (var item in pessoa)
{
Console.WriteLine(item.ToString());
}
Agora neste novo exemplo desejamos exibir na tela somente as pessoas que tenham idade entre 20 (vinte) e 30 (trinta) anos. Na Listagem 7 você confere o exemplo com lambda e na Listagem 8 sem lambda.
Listagem 7. Segundo exemplo de lambda com LINQ
lPessoa _lPessoa = new lPessoa();
foreach (var item in _lPessoa.Where(p=>p.Idade>=20
&& p.Idade<=30))
{
Console.WriteLine(item.ToString());
}
Listagem 8. Segundo exemplo de LINQ
lPessoa _lPessoa = new lPessoa();
var pessoa= from p in _lPessoa
where p.Idade>=20 && p.Idade<=30
select p
foreach (var item in pessoa)
{
Console.WriteLine(item.ToString());
}
Utilizando o lambda com o LINQ o código fica bem mais curto, economizando tempo. Com as expressões lambda você conseguirá ser bem mais produtivo.
Até a próxima!