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("Fabrizio"); 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.