Olá Pessoal, Como utilizar uma Expressão Lambda?
De início elas podem assustar um pouco quem não as conhecem, mas basta entender o conceito para transformá-las em grandes aliadas no desenvolvimento de código bonito 😉
As expressões lambda foram introduzidas no .Net para dar suporte as consultas LINQ.
“LINQ – Language Integrated Query, foi introduzido no framework 3.5 para realizar consultas diretas a base de dados ou documentos XML, coleções de objetos e qualquer outra estrutura de dados. Sua sintaxe é parecida com a linguagem SQL”
As expressões lambda se comportam como um tipo de delegate (falaremos dele em breve). Entendemos que a expressão lambda é uma espécie de função, porém sem nome, elas realizam cálculos, filtros, e retornam um valor (ou uma coleção de valores).
Para criar uma expressão lambda é necessário fazer uso do operador lambda “=>” que podemos entender como “Vai para”.
Uma expressão lambda sempre consiste de duas partes (esquerda e direita) separadas pelo “=>”. A parte à esquerda do “=>” contém uma lista de argumentos (de tipo não necessariamente definido, pois os tipos podem ser automáticamente indicados pelo compilador). O lado direito contém as instruções.
Esta é uma expressão lambda (linha 2):
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; int oddNumbers = numbers.Count(n => n % 2 == 1);
O que está sendo feito?
Note que foi criado um Array de inteiros e atribuído a ele alguns elementos numéricos.
A expressão lambda está retornando os elementos do Array que são impares.
Como? Vamos ler da seguinte forma:
Está sendo retornado um array com apenas os números que satisfazerem a expressão “n % 2 == 1”, nesse caso foram 5 dos 10 elementos numéricos.
Para quem não sabe x % y significa x módulo y, ou seja, o resto da divisão de x por y, qualquer número impar dividido por 2 resta 1, é assim que validamos números impares.
No final o método count totalizou os impares do array que foi retornado da expressão lamba.
Achou difícil? Vamos tentar esta:
// O var é uma forma de declarar uma variável que irá assumir o tipo do dado que lhe for atribuido. var SelecoesMundiais = new ArrayList(new string[] {"USA", "Africa", "Mexico", "Brasil" }); // Primeira forma de fazer um filtro usando WHERE var MelhorSelecao = from string p in SelecoesMundiais where p == "Brasil" select p; // Segunda forma de fazer um filtro usando WHERE var MelhorSelecao2 = SelecoesMundiais.Cast<string>().Where(p => p == "Brasil"); // Aqui estamos fazendo a mesma coisa sem utilizar expressão lambda List<string> MelhorSelecao3 = new List<string>(); foreach (var Selecao in SelecoesMundiais) { if (Selecao == "Brasil") { MelhorSelecao3.Add(Selecao.ToString()); } }
Precisamos assumir que é mais fácil (e prático) usar expressões lambda 🙂
O último exemplo usando ForEach atende também, mas a quantidade de variáveis e de linhas de código é maior.
Segue mais um exemplo, a ideia desse código é receber uma lista com nomes duplicados, filtrar de forma que não se repitam e converter o nome para UPPER CASE.
Repare que esta sendo chamada uma função externa dentro de uma expressão lambda:
List<string> ListaNomesDistintos = new List<string>(); List<string> ListaNomes = new List<string>(); // Adicionando nomes à lista ListaNomes.Add("Eduardo"); ListaNomes.Add("Enzo"); ListaNomes.Add("Edna"); ListaNomes.Add("Juliana"); ListaNomes.Add("Eduardo"); ListaNomes.Add("Enzo"); // Atribuindo para nova lista o retorno dos dados tratados pelo Distinct. // O Distinct no LINQ assim como no SQL é responsável por eliminar duplicações de informação. ListaNomesDistintos = ListaNomes.Distinct().ToList(); // Utilizando o ForEach genérico com uma expressão lambda. // Basicamente está pegando cada elemento e jogando dentro da função TransformaUpperCase. ListaNomesDistintos.ForEach(n => TransformaUpperCase(n)); // Aqui você pode verificar que os nomes não estão duplicados e foram transformados em UPPERCASE. public void TransformaUpperCase(string nome) { MessageBox.Show(nome.ToUpper()); }
Com esse exemplo podemos entender o quanto podemos explorar a capacidade das expressões lambda.
Esse post é apenas uma pequena amostra dos recursos, recomendo a vocês que deixem as expressões lambda fazerem parte de seus códigos, as vantagens são diversas.
Pretendo mostrar a utilização de expressão lambda em cenários mais complexos em um próximo post.
Utilizem os comentários para tirar dúvidas 🙂
Referências:
Excelente post, excelente didática, parabéns.
Fala Ronni!
Obrigado, #tamojunto 😉
estou usando as expressoes lambdas no meu projeto.
porém o metodo alterar que estou tentando fazer nao da certo.
eu quero recuperar os dados e jogar na tela para serem alterados.
segue código:
public Clientes alterar(string nome)
{
DataAcessDataContext data = new DataAcessDataContext();
data.tb_clientes.Select(emp => emp.Empresa == nome).SingleOrDefault();
data.SubmitChanges();
}
será que pode me ajudar?
Obrigado
João, desculpe a demora, pelo que vejo tem erro ai sim, você está atualizando os mesmos dados que recuperou, e os dados da tela onde estão?
Concordo! Didática muito boa!
Obrigado Erick! 🙂
Olá Dr.
Estou iniciando uma aplicação e estou adicionando a minha lista esta expressão.
Com este post foi bem legal pegar estas dicas.
Valeu Anderson,
Fique a vontade para sugerir temas para um novo artigo.
Muito obrigado pelas explicações!
Valeu Lucas,
Fique a vontade para sugerir temas para um novo artigo.
Muito bem explicad esse Foreach, travei em meu código lembrei que você tinha feito um post , vim ao site e peguei o código modifiquei e entendi!!
É isso ae, muito bom.
Muito boa explicação sobre expressões lambda,sou iniciante e conseguir aprender alguma coisa depois destas explicações,espero que vc post mais alguma coisa o quanto antes…Parabéns……Show…….Outra se tiver mais alguma sobre expressão lambda, eu vou agradecer…
Obrigado Anderson,
Vou preparar algo em breve o/
Eduardo, muito bom o post. Parabéns!
Tenho uma dúvida referente um filtro que preciso realizar.
List profilesId = GetActiveProfiles().Select(p => p.ProfileId).ToList();
Esta minha função retorna 5 Id´s (1,2,3 , 7,8)
Result<List> functionalityResult = null;
functionalityResult = functionalityBLL.List(f =>f.Profiles.Contains(profilesId);
Ou seja, queria uma forma para passar profilesId como filtro.
Obrigado
Olá amigo.
Muito obrigado por esse post. Me tirou muitas dúvidas.
Grande abraço!
simplesmente perfeito!
O Post foi muito legal e de fácil entendimento, parabéns.
Muito bom o post. Excelente explicação !!
Olá, estou iniciando com o c# e compreendi pois sua didática é ótima! Parabéns e obrigado!
Muito bom mesmo, gostei bastante do conteúdo.
Vou a notar o site nos favoritos… Valew
Obs: Caixa de comentários bonita.
Gostei bastante. Só uma observação, bem no inicio da explicação quando você dá um exemplo de um Array de números, você disse “A expressão lambda está retornando os elementos do Array que são ímpares.” Na verdade ela está retornando um “count”, ou seja, quantidade e elementos ímpares que consta no Array. Seria isso? Ou estou enganado.
Está correto, mas ele reitera isso logo após esse trecho do texto!
2019 e seu post continua sendo relevante e ajudando a galera, obrigado!!