{"id":496,"date":"2017-04-11T15:24:45","date_gmt":"2017-04-11T18:24:45","guid":{"rendered":"http:\/\/gianfratti.com\/?p=496"},"modified":"2017-04-12T18:50:52","modified_gmt":"2017-04-12T21:50:52","slug":"c-expressao-lambda","status":"publish","type":"post","link":"https:\/\/gianfratti.com\/index.php\/c-expressao-lambda\/","title":{"rendered":"C# Express\u00e3o Lambda"},"content":{"rendered":"<p>Ol\u00e1 Pessoal, Como utilizar uma Express\u00e3o Lambda?<\/p>\n<p>De in\u00edcio elas podem assustar um pouco quem n\u00e3o as conhecem, mas basta entender o conceito para transform\u00e1-las em grandes aliadas no desenvolvimento de c\u00f3digo bonito.<\/p>\n<p>As express\u00f5es lambda foram introduzidas no .Net para dar suporte as consultas LINQ.<!--more--><\/p>\n<p>\u201cLINQ \u2013 Language Integrated Query, foi introduzido no framework 3.5 para realizar consultas diretas a base de dados ou documentos XML, cole\u00e7\u00f5es de objetos e qualquer outra estrutura de dados. Sua sintaxe \u00e9 parecida com a linguagem SQL\u201d<\/p>\n<p>As express\u00f5es lambda se comportam como um tipo de delegate (falaremos dele em breve). Entendemos que a express\u00e3o lambda \u00e9 uma esp\u00e9cie de fun\u00e7\u00e3o, por\u00e9m sem nome, elas realizam c\u00e1lculos, filtros, e retornam um valor (ou uma cole\u00e7\u00e3o de valores).<\/p>\n<p>Para criar uma express\u00e3o lambda \u00e9 necess\u00e1rio fazer uso do operador lambda \u201c=&gt;\u201d que podemos entender como \u201cVai para\u201d.<\/p>\n<p>Uma express\u00e3o lambda sempre consiste de duas partes (esquerda e direita) separadas pelo\u00a0 \u201c=&gt;\u201d. A parte \u00e0 esquerda do \u201c=&gt;\u201d cont\u00e9m uma lista de argumentos (de tipo n\u00e3o necessariamente definido, pois os tipos podem ser autom\u00e1ticamente indicados pelo compilador). O lado direito cont\u00e9m as instru\u00e7\u00f5es.<\/p>\n<p>Esta \u00e9 uma express\u00e3o lambda (linha 2):<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\nint&#x5B;] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };\r\nint oddNumbers = numbers.Count(n =&gt; n % 2 == 1);\r\n<\/pre>\n<p>O que est\u00e1 sendo feito?<br \/>\nNote que foi criado um Array de inteiros e atribu\u00eddo a ele alguns elementos num\u00e9ricos.<br \/>\nA express\u00e3o lambda est\u00e1 retornando os elementos do Array que s\u00e3o impares.<\/p>\n<p>Como? Vamos ler da seguinte forma:<br \/>\nEst\u00e1 sendo retornado um array com apenas os n\u00fameros que satisfazerem a express\u00e3o\u00a0\u00a0 \u201cn % 2 == 1\u201d, nesse caso foram 5 dos 10 elementos num\u00e9ricos.<\/p>\n<p>Para quem n\u00e3o sabe x % y significa x m\u00f3dulo y, ou seja, o resto da divis\u00e3o de x por y, qualquer n\u00famero impar dividido por 2 resta 1, \u00e9 assim que validamos n\u00fameros impares.<\/p>\n<p>No final o m\u00e9todo count totalizou os impares do array que foi retornado da express\u00e3o lamba.<\/p>\n<p>Achou dif\u00edcil? Vamos tentar esta:<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n\/\/ O var \u00e9 uma forma de declarar uma vari\u00e1vel que ir\u00e1 assumir o tipo do dado que lhe for atribuido.\r\nvar SelecoesMundiais = new ArrayList(new string&#x5B;] {&quot;USA&quot;, &quot;Africa&quot;, &quot;Mexico&quot;, &quot;Brasil&quot; });\r\n\r\n\/\/ Primeira forma de fazer um filtro usando WHERE\r\nvar MelhorSelecao =\r\nfrom string p in SelecoesMundiais\r\nwhere p == &quot;Brasil&quot;\r\nselect p;\r\n\r\n\/\/ Segunda forma de fazer um filtro usando WHERE\r\nvar MelhorSelecao2 = SelecoesMundiais.Cast&lt;string&gt;().Where(p =&gt; p == &quot;Brasil&quot;);\r\n\r\n\/\/ Aqui estamos fazendo a mesma coisa sem utilizar express\u00e3o lambda\r\nList&lt;string&gt; MelhorSelecao3 = new List&lt;string&gt;();\r\n\r\nforeach (var Selecao in SelecoesMundiais)\r\n{\r\n  if (Selecao == &quot;Brasil&quot;)\r\n  {\r\n    MelhorSelecao3.Add(Selecao.ToString());\r\n  }\r\n}\r\n<\/pre>\n<p>Precisamos assumir que \u00e9 mais f\u00e1cil (e pr\u00e1tico) usar express\u00f5es lambda.<br \/>\nO \u00faltimo exemplo usando ForEach atende tamb\u00e9m, mas a quantidade de vari\u00e1veis e de linhas de c\u00f3digo \u00e9 maior.<\/p>\n<p>Segue mais um exemplo, a ideia desse c\u00f3digo \u00e9 receber uma lista com nomes duplicados, filtrar de forma que n\u00e3o se repitam e converter o nome para UPPER CASE.<br \/>\nRepare que esta sendo chamada uma fun\u00e7\u00e3o externa dentro de uma express\u00e3o lambda:<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\nList&lt;string&gt; ListaNomesDistintos = new List&lt;string&gt;();\r\nList&lt;string&gt; ListaNomes = new List&lt;string&gt;();\r\n\r\n\/\/ Adicionando nomes \u00e0 lista\r\nListaNomes.Add(&quot;Fabrizio&quot;);\r\nListaNomes.Add(&quot;Enzo&quot;);\r\nListaNomes.Add(&quot;Edna&quot;);\r\nListaNomes.Add(&quot;Juliana&quot;);\r\nListaNomes.Add(&quot;Eduardo&quot;);\r\nListaNomes.Add(&quot;Enzo&quot;);\r\n\r\n\/\/ Atribuindo para nova lista o retorno dos dados tratados pelo Distinct.\r\n\/\/ O Distinct no LINQ assim como no SQL \u00e9 respons\u00e1vel por eliminar duplica\u00e7\u00f5es de informa\u00e7\u00e3o.\r\nListaNomesDistintos = ListaNomes.Distinct().ToList();\r\n\r\n\/\/ Utilizando o ForEach gen\u00e9rico com uma express\u00e3o lambda.\r\n\/\/ Basicamente est\u00e1 pegando cada elemento e jogando dentro da fun\u00e7\u00e3o TransformaUpperCase.\r\nListaNomesDistintos.ForEach(n =&gt; TransformaUpperCase(n));\r\n\r\n\/\/ Aqui voc\u00ea pode verificar que os nomes n\u00e3o est\u00e3o duplicados e foram transformados em UPPERCASE.\r\npublic void TransformaUpperCase(string nome)\r\n{\r\n  MessageBox.Show(nome.ToUpper());\r\n}\r\n<\/pre>\n<p>Com esse exemplo podemos entender o quanto podemos explorar a capacidade das express\u00f5es lambda.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ol\u00e1 Pessoal, Como utilizar uma Express\u00e3o Lambda? De in\u00edcio elas podem assustar um pouco quem n\u00e3o as conhecem, mas basta entender o conceito para transform\u00e1-las em grandes aliadas no desenvolvimento de c\u00f3digo bonito. As express\u00f5es lambda foram introduzidas no .Net para dar suporte as consultas LINQ.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[2,15],"tags":[101],"class_list":["post-496","post","type-post","status-publish","format-standard","hentry","category-net-framework","category-back-end","tag-lambda"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/496","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/comments?post=496"}],"version-history":[{"count":4,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/496\/revisions"}],"predecessor-version":[{"id":500,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/496\/revisions\/500"}],"wp:attachment":[{"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/media?parent=496"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/categories?post=496"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/tags?post=496"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}