<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2713226685884564886</id><updated>2024-09-19T04:51:11.100-07:00</updated><title type='text'>Economizando bits</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://economizandobits.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2713226685884564886/posts/default?max-results=1000&amp;redirect=false'/><link rel='alternate' type='text/html' href='http://economizandobits.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09335542647915962978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>1000</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2713226685884564886.post-6783712089369899396</id><published>2013-03-10T20:16:00.003-07:00</published><updated>2013-03-11T19:48:53.073-07:00</updated><title type='text'>C# - LINQ SelectMany</title><content type='html'>Bom, a pedido do &lt;a href=&quot;http://www.blogger.com/profile/10203471706587629735&quot; rel=&quot;nofollow&quot; style=&quot;color: #888888; font-weight: bold; text-decoration: initial;&quot;&gt;Cristiano Carvalho&lt;/a&gt;, neste post e nos próximos estarei comentando sobre os métodos LINQ que considero mais importante.
&lt;br /&gt;
&lt;br /&gt;
Se tiverem alguma sugestão ou pedido de outros métodos, por favor.
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-first-firstordefault-single-last.html&quot; title=&quot;Métodos LINQ First, FirstOrDefault, Single, Last, LastOrDefault&quot;&gt; First(), FirstOrDefault(), Single(), Last(), LastOrDefault() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Select&quot;&gt; Select() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/03/c-linq-selectmany.html&quot; title=&quot;Método LINQ SelectMany&quot;&gt; SelectMany() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Where&quot;&gt; Where() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Métodos LINQ All, Any&quot;&gt; All(), Any() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ ConvertAll&quot;&gt; ConvertAll()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Distinct&quot;&gt; Distinct()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Except&quot;&gt; Except()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ ForEach&quot;&gt; ForEach()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ GroupBy&quot;&gt; GroupBy()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Concat&quot;&gt; Concat()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Intersect&quot;&gt; Intersect()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Union&quot;&gt; Union() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Join&quot;&gt; Join()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Métodos LINQ OrderBy, OrderByDescending&quot;&gt; OrderBy(), OrderByDescending()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Reverse&quot;&gt; Reverse() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Sort&quot;&gt; Sort() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Métodos LINQ Skip, SkipWhile&quot;&gt; Skip(), SkipWhile() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Métodos LINQ Take, TakeWhile&quot;&gt; Take(), TakeWhile() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ ToDictionary&quot;&gt; ToDictionary() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ ToLookup&quot;&gt; ToLookup() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ ZIP&quot;&gt; ZIP() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;
&lt;center&gt;
LINQ SelectMany()&lt;/center&gt;
&lt;/h1&gt;
Neste post falarei sobre um método que conheci a pouco tempo e achei interessante, pois nos permite economizar algumas linhas de código, deixando o mesmo mais legível. Este método é o SelectMany.
&lt;br /&gt;
&lt;br /&gt;
Imagine o seguinte cenário:
&lt;br /&gt;
Temos uma rede de colégios onde cada colégio tem seus professores com suas devidas matérias(matemárica, física, portugues...) 
&lt;br /&gt;
Queremos então selecionar todos os professores que lecionam Matemática.
&lt;br /&gt;
Para resolvermos esse problema necessitaríamos de 1 loop dentro de outro loop:
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Seleção dos professores utilizando ForEach dentro de ForEach&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/5132279.js&quot;&gt;&lt;/script&gt;

Não é um código muito grande, muito menos complexo, porém poderíamos obter o mesmo resultado da seguinte forma:
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Seleção dos professores utilizando SelectMany&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/5139722.js&quot;&gt;&lt;/script&gt;

O SelectMany tem uma sintaxe muito simples, vamos explicar:
&lt;br /&gt;
No exemplo acima, damos o nome de cada um dos colégios de &lt;b&gt;colegio&lt;/b&gt;. Com &lt;b&gt;&#39;FiltrarProfessoresQueConhecemMateria(colegio.Professores, materia)&#39;&lt;/b&gt;, dissemos que queremos selecionar cada um dos professores que conhecem a matéria passada por parâmetro, então todos os professores são unidos em uma única lista.
&lt;br /&gt;
&lt;br /&gt;
Se quiséssemos selecionar apenas o nome dos professores que conhecem tal matéria, como ficaria então?
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Seleção do nome dos professores utilizando SelectMany&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/5139776.js&quot;&gt;&lt;/script&gt;

Para selecionar uma propriedade do item selecionado (no caso o professor), colocamos uma segunda expressão contendo:
&lt;br /&gt;
&lt;b&gt;professores&lt;/b&gt; representa a lista dos professores que está sendo criada item a item e &lt;b&gt;professor&lt;/b&gt; é cada um dos professores. Basta dizer que queremos selecionar &lt;b&gt;professor.Propriedade&lt;/b&gt;
&lt;br /&gt;
Simples, não?
&lt;br /&gt;
&lt;br /&gt;
Criamos um exemplo que imprime o id de cada um dos professores encontrados em cada um dos métodos, utilizando o ForEach e utilizando o SelectMany, para mostrar que ambos tiveram o mesmo resultado.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ids dos professores&lt;/b&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeT_xocXUdWbrE5tcmfPEx3awCGoKzGuSb60f9v6WoSDquBdg8fI6BO6_MVhBciFYGTjqj2YlXj4Ur4XjkdILUYU6EK8rO5gEVbNjT5vFfPotLKX7j5hMXntWyYyNXhMjHigJTm6hemLY/s1600/IdsProfessores.png&quot; imageanchor=&quot;1&quot;&gt;&lt;img border=&quot;0&quot; width=&quot;500px&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeT_xocXUdWbrE5tcmfPEx3awCGoKzGuSb60f9v6WoSDquBdg8fI6BO6_MVhBciFYGTjqj2YlXj4Ur4XjkdILUYU6EK8rO5gEVbNjT5vFfPotLKX7j5hMXntWyYyNXhMjHigJTm6hemLY/s1600/IdsProfessores.png&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
Abaixo disponibilizarei as classes utilizadas. O código-fonte pode ser obtido através do link(&lt;a href=&quot;https://sites.google.com/site/economizandobits/source_selectmany/LINQSelectMany.rar&quot; title=&quot;git - linq select&quot;&gt;source&lt;/a&gt;) ou no git:
&lt;br /&gt;
http://github.com/fsaalmeidinha/linq_selectmany.git

&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Colegio.cs&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/5132233.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;b&gt;Professor.cs&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/5132238.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;b&gt;Materia.cs&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/5132239.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;b&gt;ColegioFactory.cs&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/5132244.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;b&gt;TestLinqSelectMany.cs&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/5132266.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;b&gt;Program.cs&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/5132270.js&quot;&gt;&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://economizandobits.blogspot.com/feeds/6783712089369899396/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://economizandobits.blogspot.com/2013/03/c-linq-selectmany.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2713226685884564886/posts/default/6783712089369899396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2713226685884564886/posts/default/6783712089369899396'/><link rel='alternate' type='text/html' href='http://economizandobits.blogspot.com/2013/03/c-linq-selectmany.html' title='C# - LINQ SelectMany'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09335542647915962978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeT_xocXUdWbrE5tcmfPEx3awCGoKzGuSb60f9v6WoSDquBdg8fI6BO6_MVhBciFYGTjqj2YlXj4Ur4XjkdILUYU6EK8rO5gEVbNjT5vFfPotLKX7j5hMXntWyYyNXhMjHigJTm6hemLY/s72-c/IdsProfessores.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2713226685884564886.post-8620510872858700829</id><published>2013-02-26T09:24:00.003-08:00</published><updated>2013-09-19T11:13:15.129-07:00</updated><title type='text'>Vaga para programador Delphi 2007, ASP.NET/C#</title><content type='html'>
&lt;h1&gt;&lt;a href=&quot;http://www.qualitydigital.com.br/&quot; target=&quot;blank&quot; &gt;Quality Digital&lt;/a&gt;&lt;/h1&gt;
Dados da vaga:
&lt;br /&gt;
Vaga para programador Delphi 2007, ASP.NET/C#;
Conhecimento em banco de dados SQL Server 2008 R2; 
HTML, CSS3, JavaScript 
&lt;br /&gt;
&lt;br /&gt;
É um diferencial se o candidato possuir conhecimentos com (WebForms, WebService, JSON) e E-Commerce com integração com gateway de pagamento 
&lt;br /&gt;
&lt;br /&gt;
Programação voltada para sistemas web e desktop. 
&lt;br /&gt;
&lt;br /&gt;

Requisitos:
&lt;ul&gt;
&lt;li&gt;
Delphi 2007; 
&lt;/li&gt;&lt;li&gt;
ASP.NET/C#; 
&lt;/li&gt;&lt;li&gt;
SQL Server 2008; 
&lt;/li&gt;&lt;li&gt;
HTML e CSS3; 
&lt;/li&gt;&lt;li&gt;
JavaScript; 
&lt;/li&gt;
&lt;/ul&gt;
40 horas semanais
&lt;br/&gt;
&lt;br/&gt;
Demais detalhes, envie email para &lt;a href=&quot;mailto:tainamedeiros.ti@gmail.com?Subject=Vaga%20Emprego%20http://economizandobits.blogspot.com.br/2013/02/aspnetc-webforms-webservice-json.html&quot; &gt;Taína Medeiros&lt;/a&gt; com o CV atualizado e pode mandar a url da vaga aqui do blog para ela se localizar.</content><link rel='replies' type='application/atom+xml' href='http://economizandobits.blogspot.com/feeds/8620510872858700829/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://economizandobits.blogspot.com/2013/02/aspnetc-webforms-webservice-json.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2713226685884564886/posts/default/8620510872858700829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2713226685884564886/posts/default/8620510872858700829'/><link rel='alternate' type='text/html' href='http://economizandobits.blogspot.com/2013/02/aspnetc-webforms-webservice-json.html' title='Vaga para programador Delphi 2007, ASP.NET/C#'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09335542647915962978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2713226685884564886.post-2038739484079017302</id><published>2013-02-13T19:17:00.001-08:00</published><updated>2013-03-11T19:49:18.819-07:00</updated><title type='text'>C# - LINQ First(), FirstOrDefault(), Single(), Last(), LastOrDefault()</title><content type='html'>Bom, a pedido do &lt;a href=&quot;http://www.blogger.com/profile/10203471706587629735&quot; rel=&quot;nofollow&quot; style=&quot;color: #888888; font-weight: bold; text-decoration: initial;&quot;&gt;Cristiano Carvalho&lt;/a&gt;, neste post e nos próximos estarei comentando sobre os métodos LINQ que considero mais importante.
&lt;br /&gt;
&lt;br /&gt;
Se tiverem alguma sugestão ou pedido de outros métodos, por favor.
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-first-firstordefault-single-last.html&quot; title=&quot;Métodos LINQ First, FirstOrDefault, Single, Last, LastOrDefault&quot;&gt; First(), FirstOrDefault(), Single(), Last(), LastOrDefault() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Select&quot;&gt; Select() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/03/c-linq-selectmany.html&quot; title=&quot;Método LINQ SelectMany&quot;&gt; SelectMany() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Where&quot;&gt; Where() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Métodos LINQ All, Any&quot;&gt; All(), Any() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ ConvertAll&quot;&gt; ConvertAll()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Distinct&quot;&gt; Distinct()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Except&quot;&gt; Except()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ ForEach&quot;&gt; ForEach()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ GroupBy&quot;&gt; GroupBy()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Concat&quot;&gt; Concat()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Intersect&quot;&gt; Intersect()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Union&quot;&gt; Union() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Join&quot;&gt; Join()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Métodos LINQ OrderBy, OrderByDescending&quot;&gt; OrderBy(), OrderByDescending()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Reverse&quot;&gt; Reverse() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Sort&quot;&gt; Sort() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Métodos LINQ Skip, SkipWhile&quot;&gt; Skip(), SkipWhile() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Métodos LINQ Take, TakeWhile&quot;&gt; Take(), TakeWhile() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ ToDictionary&quot;&gt; ToDictionary() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ ToLookup&quot;&gt; ToLookup() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ ZIP&quot;&gt; ZIP() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;
&lt;center&gt;
LINQ First(), FirstOrDefault(), Single(), Last(), LastOrDefault()&lt;/center&gt;
&lt;/h1&gt;
&lt;br /&gt;
Neste post falarei sobre os métodos First, FirstOrDefault, Single, Last e LastOrDefault do LINQ, que são muito simples, mas exigem cuidado.
&lt;br /&gt;
Todos são métodos de busca com uma sobrecarga que permite que seja atribuído um predicado à busca, ou seja, podemos fazer uma busca em uma lista de números inteiros, onde o predicado é: &quot;que seja maior do que 10&quot;, por exemplo.
&lt;br /&gt;
int primeiroNumeroMaiorQueDez = listaDeNumerosInteiros.First(numero =&amp;gt; numero &amp;gt; 10);
&lt;br /&gt;
&lt;br /&gt;
Apesar dos métodos First e FirstOrDefault fazerem praticamente a mesma coisa, eles tem algumas diferenças, que serão discutidas adiante:
&lt;br /&gt;
&lt;br /&gt;
Fizemos um teste, buscando em uma lista de números inteiros, o primeiro elemento com o valor 100, através do método FIRST, sendo que na lista existia tal número.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Teste FIRST em uma lista com o elemento procurado&lt;/b&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuOsKO20u6gTJQk3szxU08mZShWPsxWa_lpvYsXvtvLguNH18bAdwqsY9GrMblNX440CWvlFLjWScTEAD-wpCRfkCVCCEw4hy_KCWsEzJdGe27bjzXHPwM7gWRwR8Y15X-DthOV0uVvfc/s1600/FIRST_COM_ELEMENTO.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;60&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuOsKO20u6gTJQk3szxU08mZShWPsxWa_lpvYsXvtvLguNH18bAdwqsY9GrMblNX440CWvlFLjWScTEAD-wpCRfkCVCCEw4hy_KCWsEzJdGe27bjzXHPwM7gWRwR8Y15X-DthOV0uVvfc/s1600/FIRST_COM_ELEMENTO.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Em seguida fizemos o mesmo teste, em uma lista que não contém o número 100, o que nos levaria a uma dúvida: &quot;O que o método irá nos retornar então?&quot;. A resposta é: &quot;Uma exception&quot;.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Teste FIRST em uma lista sem o elemento procurado&lt;/b&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgg2PL4xgtklQsA21XFw2BZLGXMcZtKwzVPLnU67HXDcSfm6dwn75pxZB2cjmrVXY1AeXV8umv3mnajle0BliFvWzMqr47L0ehpdeHh2UN6yqD_cCLCU08VnUpKMRVepikC8-HwOgkpjIY/s1600/FIRST_SEM_ELEMENTO.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;60&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgg2PL4xgtklQsA21XFw2BZLGXMcZtKwzVPLnU67HXDcSfm6dwn75pxZB2cjmrVXY1AeXV8umv3mnajle0BliFvWzMqr47L0ehpdeHh2UN6yqD_cCLCU08VnUpKMRVepikC8-HwOgkpjIY/s1600/FIRST_SEM_ELEMENTO.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Porém, em alguns momentos, gostaríamos de recuperar o elemento procurado apenas se ele existir, e se não existir, queremos que um valor default seja retornado, sem gerar exception, que no caso de uma lista de números inteiros é o número 0.
&lt;br /&gt;
Neste caso, devemos utilizar o método FIRSTORDEFAULT:
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Teste FIRSTORDEFAULT em uma lista sem o elemento procurado&lt;/b&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitrXikpDWjbJrJXUxotWuQ11Ypkm1xkNFn3sSA_jHfVpFNx5825dhOamIAdHFNmszQpsUPa37wWdZ1t31rUj557G6BwWuvcivf5wtzvEItdzxmERflL-r3MRmMIHEhD3-Nw7T8znhUv50/s1600/FIRSTORDEFAULT_SEM_ELEMENTO.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;60&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitrXikpDWjbJrJXUxotWuQ11Ypkm1xkNFn3sSA_jHfVpFNx5825dhOamIAdHFNmszQpsUPa37wWdZ1t31rUj557G6BwWuvcivf5wtzvEItdzxmERflL-r3MRmMIHEhD3-Nw7T8znhUv50/s1600/FIRSTORDEFAULT_SEM_ELEMENTO.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Outro método que busca um elemento em uma lista é o Single, com o diferencial de que tal método, está esperando procurar um elemento único em uma lista, portanto o número de ocorrências do número procurado na lista não pode ser diferente de 1:
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Teste SINGLE em uma lista sem o elemento procurado&lt;/b&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhL2PNrmAsh93TTVD1cx0Dxpf6Wbs0GnL5L7XTHDEgM_CT1z8bKxqpYOTZEpgN6WHsJVr8wwbAa64TIcZDIytkPxmZLLEaJ3BEkrRY89BcVtHVe6sEGKBu2vbK3mkqbzMCnIBYcGf7Xfk/s1600/SINGLE_SEM_ELEMENTO.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;60&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhL2PNrmAsh93TTVD1cx0Dxpf6Wbs0GnL5L7XTHDEgM_CT1z8bKxqpYOTZEpgN6WHsJVr8wwbAa64TIcZDIytkPxmZLLEaJ3BEkrRY89BcVtHVe6sEGKBu2vbK3mkqbzMCnIBYcGf7Xfk/s1600/SINGLE_SEM_ELEMENTO.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Teste SINGLE em uma lista com apenas uma ocorrência do número procurado&lt;/b&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8YTtpW7RtDl9uLvDIQ0uqWlyk_C2envF_oaf8gHUWtADPf2pMpMkLh8iP_ueIcRGYiTwGpoLsjZRWaGuU4lNXHJbzYZJdyu8dltmD_5cX7LAiL3kaeZseJNC_Nzw7NiTbMKkW3vgSe6g/s1600/SINGLE_UMAOCORRENCIA.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;60&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8YTtpW7RtDl9uLvDIQ0uqWlyk_C2envF_oaf8gHUWtADPf2pMpMkLh8iP_ueIcRGYiTwGpoLsjZRWaGuU4lNXHJbzYZJdyu8dltmD_5cX7LAiL3kaeZseJNC_Nzw7NiTbMKkW3vgSe6g/s1600/SINGLE_UMAOCORRENCIA.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Teste SINGLE em uma lista com mais de uma ocorrência do número procurado&lt;/b&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieAZa1Upp76OOU9bMaKjyYjcV_3LbbwCLR1EenyZeEpGoc-YFnw7KxuyPQkKaX7NExUSEdH9z8T8Wdx8XIER7larzCyaM34SPMbFxVA7xq4DZp5W5YPLoa8RBEzWIAVndYeI7LfYzjdvY/s1600/SINGLE_MAISDEUMAOCORRENCIA.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;60&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieAZa1Upp76OOU9bMaKjyYjcV_3LbbwCLR1EenyZeEpGoc-YFnw7KxuyPQkKaX7NExUSEdH9z8T8Wdx8XIER7larzCyaM34SPMbFxVA7xq4DZp5W5YPLoa8RBEzWIAVndYeI7LfYzjdvY/s1600/SINGLE_MAISDEUMAOCORRENCIA.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Os métodos Last e LastOrDefault, se assemelham ao Fist e FirstOrDefault respectivamente, sendo que ao invés de buscarem o primeiro elemento, buscam o ultimo.
&lt;br /&gt;
&lt;br /&gt;
Não confunda. Com o método FirstOrDefault, o método First e Single parecem ser inúteis, porém cada um deles tem suas utilidades, por exemplo:
&lt;br /&gt;
Se quisermos procurar em um cadastro, onde o CPF deve ser único, um usuário que tenha o CPF = 118.187.881-00, qual método usaríamos e porque?
&lt;br /&gt;
&lt;br/&gt;
A resposta é: &quot;Single&quot;, pois se existir mais de um usuário com o CPF procurado, por alguma falha na lógica do sistema, isso pode gerar um problemão.
&lt;br /&gt;
&lt;br/&gt;
Suponha que a intenção de buscar o usuário pelo CPF seja de debitar um valor X de sua conta, gostaria que houvesse uma confusão entre 2 usuários, ou preferiria que uma exception fosse gerada para que sua equipe pudesse analisar o problema?
&lt;br /&gt;
&lt;br /&gt;
Bom, espero ter ajudado.
&lt;br /&gt;
&lt;br /&gt;
Abaixo disponibilizarei as classes utilizadas. O código-fonte pode ser obtido através do link(&lt;a href=&quot;https://sites.google.com/site/economizandobits/source_linqfirst_single_last/LinqFirst_Single_Last.rar&quot; title=&quot;git - linq first, firstOrDefault, single, last, lastOrDefault&quot;&gt;source&lt;/a&gt;) ou no git:
&lt;br /&gt;
https://github.com/fsaalmeidinha/LinqFirst_Single_Last.git

&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;TestLinqMethods.cs&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4950329.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;b&gt;Program.cs&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4950341.js&quot;&gt;&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://economizandobits.blogspot.com/feeds/2038739484079017302/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://economizandobits.blogspot.com/2013/02/c-linq-first-firstordefault-single-last.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2713226685884564886/posts/default/2038739484079017302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2713226685884564886/posts/default/2038739484079017302'/><link rel='alternate' type='text/html' href='http://economizandobits.blogspot.com/2013/02/c-linq-first-firstordefault-single-last.html' title='C# - LINQ First(), FirstOrDefault(), Single(), Last(), LastOrDefault()'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09335542647915962978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuOsKO20u6gTJQk3szxU08mZShWPsxWa_lpvYsXvtvLguNH18bAdwqsY9GrMblNX440CWvlFLjWScTEAD-wpCRfkCVCCEw4hy_KCWsEzJdGe27bjzXHPwM7gWRwR8Y15X-DthOV0uVvfc/s72-c/FIRST_COM_ELEMENTO.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2713226685884564886.post-7603265735849354064</id><published>2013-02-07T22:39:00.000-08:00</published><updated>2013-03-11T19:49:42.622-07:00</updated><title type='text'>C# - LINQ Select</title><content type='html'>Bom, a pedido do &lt;a href=&quot;http://www.blogger.com/profile/10203471706587629735&quot; rel=&quot;nofollow&quot; style=&quot;color: #888888; font-weight: bold; text-decoration: initial;&quot;&gt;Cristiano Carvalho&lt;/a&gt;, neste post e nos próximos estarei comentando sobre os métodos LINQ que considero mais importante.
&lt;br /&gt;
&lt;br /&gt;
Se tiverem alguma sugestão ou pedido de outros métodos, por favor.
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-first-firstordefault-single-last.html&quot; title=&quot;Métodos LINQ First, FirstOrDefault, Single, Last, LastOrDefault&quot;&gt; First(), FirstOrDefault(), Single(), Last(), LastOrDefault() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Select&quot;&gt; Select() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/03/c-linq-selectmany.html&quot; title=&quot;Método LINQ SelectMany&quot;&gt; SelectMany() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Where&quot;&gt; Where() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Métodos LINQ All, Any&quot;&gt; All(), Any() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ ConvertAll&quot;&gt; ConvertAll()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Distinct&quot;&gt; Distinct()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Except&quot;&gt; Except()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ ForEach&quot;&gt; ForEach()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ GroupBy&quot;&gt; GroupBy()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Concat&quot;&gt; Concat()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Intersect&quot;&gt; Intersect()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Union&quot;&gt; Union() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Join&quot;&gt; Join()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Métodos LINQ OrderBy, OrderByDescending&quot;&gt; OrderBy(), OrderByDescending()&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Reverse&quot;&gt; Reverse() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ Sort&quot;&gt; Sort() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Métodos LINQ Skip, SkipWhile&quot;&gt; Skip(), SkipWhile() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Métodos LINQ Take, TakeWhile&quot;&gt; Take(), TakeWhile() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ ToDictionary&quot;&gt; ToDictionary() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ ToLookup&quot;&gt; ToLookup() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;
&lt;a href=&quot;http://economizandobits.blogspot.com.br/2013/02/c-linq-select.html&quot; title=&quot;Método LINQ ZIP&quot;&gt; ZIP() &lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;
&lt;center&gt;
LINQ Select()&lt;/center&gt;
&lt;/h1&gt;
&lt;br /&gt;
Neste post falarei sobre o método Select do LINQ.
&lt;br /&gt;
Como o próprio nome já diz, a função do método select é selecionar algo
&lt;br /&gt;
Por exemplo:
&lt;br /&gt;
Temos uma lista de usuários e queremos selecionar apenas os Ids desses usuários para trabalhar com uma estrutura mais simples e leve
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Selecionar os ids dos usuários&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4736833.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwExtyimST4XcUA-Mtoi-wsY2g1Ho0YOZNxcLu8TNRrPhxs5mswE-kfrw2rNJlzO3z2603Kyc4_ZKEosj0l07IRWw-z8eOh2-t6ZVE5Inq1ONHMVrTOo3cfFL7S1hhNpzflWYDU4dWDfY/s1600/resultado_linq_select_selecionarIdsusuarios.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwExtyimST4XcUA-Mtoi-wsY2g1Ho0YOZNxcLu8TNRrPhxs5mswE-kfrw2rNJlzO3z2603Kyc4_ZKEosj0l07IRWw-z8eOh2-t6ZVE5Inq1ONHMVrTOo3cfFL7S1hhNpzflWYDU4dWDfY/s1600/resultado_linq_select_selecionarIdsusuarios.png&quot; style=&quot;width: 500px;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Podemos também selecionar objetos anônimos
&lt;br /&gt;
Por exemplo:
&lt;br /&gt;
Temos de listar os usuários, mas aos invés de retornar os campos do objeto Usuario, queremos retornar outros campos. O detalhe é que o retorno desse select deve ser armazenado em uma variável do tipo object ou VAR (variáveis não tipadas):
&lt;br /&gt;
Queremos retornar um novo objeto com:
&lt;br /&gt;
Id: Igual ao do usuário
&lt;br /&gt;
Descricao: NomeUsuario(EmailUsuario) - &#39;Ex: Felipe Almeida(felipe.silvalmeida@gmail.com)&#39;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt; Select anônimo &lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/a10e3bcb6418c1bbddcb.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIu5uocm157rFXHZqng4bprRrRu2p9oCydjpwO2gT73Un_Z_nagM3TsTxgbSSV80sIIwYOZ0MkclzmP1j7AN8qDoOu23molM5BGLbHG6XduUxEG86dLO3ZLPfx3n03O07cvVtK3icOAtg/s1600/resultado_linq_select_anonimo.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIu5uocm157rFXHZqng4bprRrRu2p9oCydjpwO2gT73Un_Z_nagM3TsTxgbSSV80sIIwYOZ0MkclzmP1j7AN8qDoOu23molM5BGLbHG6XduUxEG86dLO3ZLPfx3n03O07cvVtK3icOAtg/s1600/resultado_linq_select_anonimo.png&quot; style=&quot;width: 500px;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Outra curiosidade que poucos conhecem, é a possibilidade de incluir o índice do objeto na lista, no método select, ou seja, agora temos algo do tipo:
&lt;br /&gt;
&lt;br /&gt;
usuarios.Select((usuario,&lt;b&gt;&lt;u&gt;indice&lt;/u&gt;&lt;/b&gt;) =&amp;gt; new { IndiceNaLista = indice, NomeUsuario = usuario.Nome });
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt; Select com índice &lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4736981.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_PAov-owAY2LUmvEaq5fP4l-lk-om5WjYRD3SkRWQFHu3mgUBFvf18qBUYbORXoWpK8r6IuMC3-Ik3oHMXjREnriQAehX-MhcPgy33pc8-LRTWiqcnU1_sRPox4h3PRk0793A4_9ItQY/s1600/resultado_linq_select_comIndices.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;70&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_PAov-owAY2LUmvEaq5fP4l-lk-om5WjYRD3SkRWQFHu3mgUBFvf18qBUYbORXoWpK8r6IuMC3-Ik3oHMXjREnriQAehX-MhcPgy33pc8-LRTWiqcnU1_sRPox4h3PRk0793A4_9ItQY/s320/resultado_linq_select_comIndices.png&quot; width=&quot;450&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Abaixo disponibilizarei as classes utilizadas. O código-fonte pode ser obtido através do link(&lt;a href=&quot;https://sites.google.com/site/economizandobits/source_linq_select/LINQSelect.rar&quot; title=&quot;git - linq select&quot;&gt;source&lt;/a&gt;) ou no git:
&lt;br /&gt;
http://github.com/fsaalmeidinha/linq_select.git

&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;LinqSelect.cs&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4737056.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;b&gt;Usuario.cs&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4737064.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;b&gt;Program.cs&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4737077.js&quot;&gt;&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://economizandobits.blogspot.com/feeds/7603265735849354064/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://economizandobits.blogspot.com/2013/02/c-linq-select.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2713226685884564886/posts/default/7603265735849354064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2713226685884564886/posts/default/7603265735849354064'/><link rel='alternate' type='text/html' href='http://economizandobits.blogspot.com/2013/02/c-linq-select.html' title='C# - LINQ Select'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09335542647915962978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwExtyimST4XcUA-Mtoi-wsY2g1Ho0YOZNxcLu8TNRrPhxs5mswE-kfrw2rNJlzO3z2603Kyc4_ZKEosj0l07IRWw-z8eOh2-t6ZVE5Inq1ONHMVrTOo3cfFL7S1hhNpzflWYDU4dWDfY/s72-c/resultado_linq_select_selecionarIdsusuarios.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2713226685884564886.post-2707632124748932845</id><published>2013-02-06T18:29:00.002-08:00</published><updated>2013-02-07T08:03:59.315-08:00</updated><title type='text'>C# - Criando métodos de extensão</title><content type='html'>Neste post, acredito que vou ajudar muitas pessoas que trabalham com enumeradores em seus códigos. Vou falar sobre Extension Methods.
&lt;br /&gt;
Para quem já utilizou os métodos que o System.Linq disponibiliza, de uma forma ou de outra já utilizou métodos de extensão.
&lt;br /&gt;
Como assim?
&lt;br /&gt;
&lt;br /&gt;
Já repararam que quando incluimos o pacote System.Linq em nosso código, as nossas listas passam a ter novos métodos como &#39;First&#39;, &#39;FirstOrDefault&#39;, &#39;Select&#39;, entre outros?
&lt;br /&gt;
&lt;br /&gt;
Ótimo, esses são métodos de extensão da interface IEnumerable, ou seja, todas as formas de listagem a partir de agora possuem tais métodos.
&lt;br /&gt;
&lt;br /&gt;
Para quem já conhecia o System.Linq, nunca se perguntou como esses métodos apareceram nos nossos objetos IEnumerable? Eu me perguntava há um tempo atrás, antes de conhecer os métodos de extensão, mas pensava que não seria possível criar os meus próprios métodos de extensão, e ai que me enganei.
&lt;br /&gt;
&lt;br /&gt;
Há alguns meses, por acaso acabei descobrindo como esses métodos aparecem em nossos objetos, e acredite, é de uma forma muito simples.
&lt;br /&gt;
&lt;br /&gt;
Por exemplo, quero criar um método de extensão para os objetos do tipo String, para verificar o tamanho de uma string(assim como o método Length faz), mas com um diferencial de quando a string for nula, quero que seja retornado length = 0 ao invés de obter uma  NULL POINTER EXCEPTION.
&lt;br /&gt;
Simplesmente criaremos uma classe estática com o nome StringExtensions:
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;StringExtensions.cs&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4727846.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
Agora basta incluir o namespace em que o StringExtensions.cs foi criado na classe em que queremos tal funcionalidade:
&lt;br /&gt;
using ExtensionsMethods.Extensions;
&lt;br /&gt;
&lt;br /&gt;
A partir de então, todos os objetos do tipo string terão o método LengthOrDefault.
&lt;br /&gt;
&lt;br /&gt;
Legal, agora que já aprendemos como criar um método de extensão, irei mostrar como isso pode nos ajudar trabalhando com enumeradores. Digamos que temos um cadastro de usuário em um sistema e um dos campos que devem ser preenchidos é o tipo de pessoa(&#39;Pessoa Física&#39; ou &#39;Pessoa Jurídica&#39;).&lt;br /&gt;
&lt;br /&gt;
Como sabemos, um enumerador não tem descrição, mas ao mesmo tempo, não gostaríamos que na nossa tela, as opções apresentadas fossem &#39;PessoaFisica&#39;, &#39;PessoaJuridica&#39;, ignorando acentuação e o espaço entre as palavras, então como faríamos para vincular uma descrição aos enumeradores? Melhor ainda, não seria perfeito se pudéssemos obter a descrição de um enumerador como uma propriedade do próprio enumerador? (ex: ETipoPessoa.Fisica.Descricao)&lt;br /&gt;
&lt;br /&gt;
Faremos isso, mas ao invés de uma propriedade, iremos criar um método de extensão que recupera a descrição do enumerador através de um atributo do mesmo.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;ETipoPessoa.cs&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4727903.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;b&gt;EnumExtensions.cs&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4727896.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
Como disse, basta incluir o namespace ExtensionMethods.Extensions na classe onde desejamos obter a descrição do enumerador e..
&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4727912.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
Executando o código obtivemos o seguinte resultado:
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQmEOeleJROrmT4vgiBnS9aUElslr4I2HlmKa57rSKNatCW8BnTO6DLPEO5u-N-Z0BTLUhc1NqCjT46wXAWNVOCE7V3LRn31Um0eE8ygMzBS3wHq4jDcVT6sF63NBuhYJpdGxMyBzg05E/s1600/resultado.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQmEOeleJROrmT4vgiBnS9aUElslr4I2HlmKa57rSKNatCW8BnTO6DLPEO5u-N-Z0BTLUhc1NqCjT46wXAWNVOCE7V3LRn31Um0eE8ygMzBS3wHq4jDcVT6sF63NBuhYJpdGxMyBzg05E/s1600/resultado.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Muito bom, agora conseguimos obter a descrição de um enumerador de forma fácil.
&lt;br /&gt;
Basta utilizar a criatividade para criar métodos de extensão que nos ajude no nosso dia  a dia.
&lt;br /&gt;
&lt;br /&gt;
O código fonte pode ser encontrado no link(&lt;a href=&quot;https://sites.google.com/site/economizandobits/source_extensionmethods/ExtensionMethods.rar&quot; target=&quot;_blank&quot;&gt;source&lt;/a&gt;) ou através do git em:
&lt;br /&gt;
https://github.com/fsaalmeidinha/extensionmethods.git
&lt;br /&gt;
&lt;br /&gt;
Qualquer dúvida ou crítica, podem comentar no post ou entrar em contato por email ou skype(informados à direita).
</content><link rel='replies' type='application/atom+xml' href='http://economizandobits.blogspot.com/feeds/2707632124748932845/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://economizandobits.blogspot.com/2013/02/c-criando-metodos-de-extensao.html#comment-form' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2713226685884564886/posts/default/2707632124748932845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2713226685884564886/posts/default/2707632124748932845'/><link rel='alternate' type='text/html' href='http://economizandobits.blogspot.com/2013/02/c-criando-metodos-de-extensao.html' title='C# - Criando métodos de extensão'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09335542647915962978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQmEOeleJROrmT4vgiBnS9aUElslr4I2HlmKa57rSKNatCW8BnTO6DLPEO5u-N-Z0BTLUhc1NqCjT46wXAWNVOCE7V3LRn31Um0eE8ygMzBS3wHq4jDcVT6sF63NBuhYJpdGxMyBzg05E/s72-c/resultado.png" height="72" width="72"/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2713226685884564886.post-1958636108434856581</id><published>2013-02-05T17:49:00.000-08:00</published><updated>2013-02-06T19:56:38.738-08:00</updated><title type='text'>C# - Yield Return</title><content type='html'>&lt;b&gt;Yield return&lt;/b&gt; é um comando que pouca gente conhece e menos ainda o utiliza, porém em alguns casos, nos ajuda e muito.&lt;br /&gt;
&lt;b&gt;Yield return&lt;/b&gt; utiliza lazy-load, ou seja, carregar aos poucos.&lt;br /&gt;
A sintaxe do yield é muito simples:&lt;br /&gt;
&lt;b&gt;RecuperarSerieFibonacci&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4719369.js&quot;&gt;&lt;/script&gt;

Neste exemplo, temos um método que retorna a série de fibonacci (1,1,2,3,5,8...). Se prestarmos atenção no código, podemos perceber que ele não tem uma condição de parada, o que nos levaria a pensar que a execução do mesmo nunca sairia do loop, porém ai que entra o &quot;carregar aos poucos&quot;.&lt;br /&gt;
Quando chamamos o método RecuperarSerieFibonacci, o valor da série só será carregado quando pedirmos, por exemplo: RecuperarSerieFibonacci().Take(10).ToList() iria processar os 10 primeiros números da série de fibonacci.&lt;br /&gt;
Bom, mas poderiamos fazer o mesmo sem utilizar a série de fibonacci, certo? Então qual a vantagem?&lt;br /&gt;
Criei um outro exemplo onde precisamos descobrir o índice de uma palavra dentro de um arquivo de texto, então, para simular o problema, criei um arquivo com cerca de 30 mil linhas e coloquei 3 palavras que deveriam ser encontradas:&lt;br /&gt;
1.&amp;nbsp;inconstitucionalissimamente (no inicío do arquivo, proximo da linha de número 10)&lt;br /&gt;
2.&amp;nbsp;paralelepipedo (na metade do arquivo, proximo da linha de número 15 mil)&lt;br /&gt;
3.&amp;nbsp;pneumonia (no final do arquivo, proximo da linha de número 30 mil)&lt;br /&gt;
Criei também 2 métodos para retornar cada uma das palavras de cada linha do arquivo, um utilizando yield return e o outro não.&lt;br /&gt;
Por fim, chamei os métodos procurando cada uma das palavras, obtendo o seguinte resultado:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTLz12hQUUCzdYix5lFPPkhy20KR28v7LIhOFm2eui88_V1bIefYOEEPksWlNvu5xvG16Kjnnp69mfbLlm6sUgFyeXby2IjlTYlqv_lLFq29YifRIbAKxh0a5zW9XK4wsacRkcIxImU9I/s1600/resultado_analise.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Resultado Analisador&quot; border=&quot;0&quot; height=&quot;235&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTLz12hQUUCzdYix5lFPPkhy20KR28v7LIhOFm2eui88_V1bIefYOEEPksWlNvu5xvG16Kjnnp69mfbLlm6sUgFyeXby2IjlTYlqv_lLFq29YifRIbAKxh0a5zW9XK4wsacRkcIxImU9I/s640/resultado_analise.png&quot; title=&quot;Resultado Analisador&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Como pudemos observar, em todos os casos, obtivemos um melhor resultado quando utilizamos o yield return, isso ocorreu pelos seguintes motivos:&lt;br /&gt;
1. Quando procuramos as palavras que estavam no inicio ou no meio do arquivo, quando não utilizamos o yield return, todo o arquivo era lido e separado por palavras para depois a palavra ser procurada, já quando utilizamos o yield return, o arquivo era lido a cada linha, fazendo com que o arquivo não precisasse ser lido por completo, economizando tempo de leitura.&lt;br /&gt;
2. No caso da terceira palavra, como a mesma estava no final do arquivo, então porque ainda assim a performance foi melhor? Isso ocorre pois utilizando o yield return, os valores retornados pela função não foram armazenados em memória da forma como&amp;nbsp;construímos&amp;nbsp;a busca.&lt;br /&gt;
&lt;br /&gt;
Muito bom não?&lt;br /&gt;
&lt;br /&gt;
Abaixo estou disponibilizando as classes utilizadas. O arquivo de texto utilizado para a busca só pode ser encontrado através do download do código fonte no link (&lt;a href=&quot;https://sites.google.com/site/economizandobits/source_yieldreturn/YieldReturn.rar&quot; target=&quot;_blank&quot;&gt;source&lt;/a&gt;) ou fazendo download através do git em:&lt;br /&gt;
https://github.com/fsaalmeidinha/yieldreturn.git&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;FileTexthelper.cs&lt;/b&gt;&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4719321.js&quot;&gt;&lt;/script&gt;

&lt;b&gt;Analisador.cs&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4719510.js&quot;&gt;&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://economizandobits.blogspot.com/feeds/1958636108434856581/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://economizandobits.blogspot.com/2013/02/yield-return.html#comment-form' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2713226685884564886/posts/default/1958636108434856581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2713226685884564886/posts/default/1958636108434856581'/><link rel='alternate' type='text/html' href='http://economizandobits.blogspot.com/2013/02/yield-return.html' title='C# - Yield Return'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09335542647915962978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTLz12hQUUCzdYix5lFPPkhy20KR28v7LIhOFm2eui88_V1bIefYOEEPksWlNvu5xvG16Kjnnp69mfbLlm6sUgFyeXby2IjlTYlqv_lLFq29YifRIbAKxh0a5zW9XK4wsacRkcIxImU9I/s72-c/resultado_analise.png" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2713226685884564886.post-2367283623227971315</id><published>2013-02-03T06:13:00.000-08:00</published><updated>2013-02-03T06:13:24.555-08:00</updated><title type='text'>Política de Privacidade</title><content type='html'>Este site pode utilizar cookies e/ou web beacons quando um usuário tem acesso às páginas. Os cookies que podem ser utilizados associam-se (se for o caso) unicamente com o navegador de um determinado computador.

Os cookies que são utilizados neste site podem ser instalados pelo mesmo, os quais são originados dos distintos servidores operados por este, ou a partir dos servidores de terceiros que prestam serviços e instalam cookies e/ou web beacons (por exemplo, os cookies que são empregados para prover serviços de publicidade ou certos conteúdos através dos quais o usuário visualiza a publicidade ou conteúdos em tempo pré-determinados).

Usamos empresas de publicidade de terceiros para veicular anúncios durante a sua visita ao nosso website. Essas empresas podem usar informações (que não incluem o seu nome, endereço, endereço de e-mail ou número de telefone) sobre suas visitas a este e a outros websites a fim de exibir anúncios relacionados a produtos e serviços de seu interesse.

O Google, como fornecedor de terceiros, utiliza cookies para exibir anúncios neste site.
Com o cookie DART, o Google pode exibir anúncios para o usuário com base nas visitas feitas à este ou à outros sites na Internet.
O usuário pode desativar o cookie DART visitando a Política de privacidade da rede de conteúdo e dos anúncios do Google.
O usuário têm a possibilidade de configurar seu navegador para ser avisado, na tela do computador, sobre a recepção dos cookies e para impedir a sua instalação no disco rígido. As informações pertinentes a esta configuração estão disponíveis em instruções e manuais do próprio navegador.</content><link rel='replies' type='application/atom+xml' href='http://economizandobits.blogspot.com/feeds/2367283623227971315/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://economizandobits.blogspot.com/2013/02/politica-de-privacidade.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2713226685884564886/posts/default/2367283623227971315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2713226685884564886/posts/default/2367283623227971315'/><link rel='alternate' type='text/html' href='http://economizandobits.blogspot.com/2013/02/politica-de-privacidade.html' title='Política de Privacidade'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09335542647915962978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2713226685884564886.post-4901051304070893042</id><published>2013-02-02T12:09:00.003-08:00</published><updated>2013-02-06T19:57:17.846-08:00</updated><title type='text'>C# - Utilizando o Try Catch</title><content type='html'>Esse post eu dedico para aqueles que acham que &lt;b&gt;try catch&lt;/b&gt; pode ser utilizado para qualquer fim e a qualquer hora.&lt;br /&gt;
Acredito que todos conhecem como devemos utilizar o famoso &lt;b&gt;try catch&lt;/b&gt;, então vou dar apenas uma breve explicação.&lt;br /&gt;
Existem partes do nosso código que não conseguimos gerenciar, como por exemplo, quando utilizamos dlls externas ou quando consumimos um WebService, nesses casos, internamente, na chamada do método, podem ocorrer erros que não&amp;nbsp;gostaríamos&amp;nbsp;que fossem exibidos ao usuário do nosso sistema, então adicionamos um bloco de tratamento de exceção onde o try engloba o bloco de código não gerenciavel e o catch contém o tratamento da exceção e por &amp;nbsp;fim podemos adicionar um finally que será executado em caso de exceção ou não.&lt;br /&gt;
&lt;b&gt;Exemplo bloco try catch&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4719782.js&quot;&gt;&lt;/script&gt;

Ou seja, o bloco try catch só deve ser adicionado quando não conseguimos encontrar uma forma de descobrir se um bloco irá dar erro ou não.&lt;br /&gt;
&lt;br /&gt;
Estou enfatizando o correto uso do try catch, pois muitos programadores(inclusive eu em meus primeiros meses de programação) não sabem o quanto ele não é performático, e optam por utilizar o bloco try catch em momentos em que conseguimos evitar uma exception, por exemplo:&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4719804.js&quot;&gt;&lt;/script&gt;
- Temos um cadastro de usuário que deve ser validado antes de ser gravado no banco de dados.&lt;br /&gt;
Usuario{Id, Nome,Idade,...}&lt;br /&gt;
&amp;nbsp;Criamos 2 métodos, o primeiro validando se o nome do usuário foi informado e se tem até 100 caracteres utilizando try catch:
&lt;br /&gt;
&lt;b&gt;Utilizando o try catch
&lt;/b&gt;&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4719794.js&quot;&gt;&lt;/script&gt;

e outro validando da forma correta, verificando antes se o Nome não é nulo, pois isso não nos permitiria ver se o tamanho do nome tem mais de 100 caracteres:
&lt;br /&gt;
&lt;b&gt;Não utilizando o try catch&lt;/b&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4719798.js&quot;&gt;&lt;/script&gt;
Simulamos a execução de tais métodos 10 e 1000 vezes, informando um usuário com nome = null para ver quanto tempo demorou cada uma das execuções e obtivemos o seguinte resultado:
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-IaKR_KCH-LbIq5Q7lg8YRlhB1OmJjWYP411KXAiv5NerPRkHWI9ZdAxvvdAuMLgsVmTMb-DXUrjJiNnxjymdSp0peMGeHLe8Z5n5WA_0Yx_UmVNbfXLu7BZv714bEAcXE773_2jBk6k/s1600/resultado.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-IaKR_KCH-LbIq5Q7lg8YRlhB1OmJjWYP411KXAiv5NerPRkHWI9ZdAxvvdAuMLgsVmTMb-DXUrjJiNnxjymdSp0peMGeHLe8Z5n5WA_0Yx_UmVNbfXLu7BZv714bEAcXE773_2jBk6k/s640/resultado.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Como podemos verificar, utilizando o try catch, o tempo de execução foi muito maior, portanto, quando forem utilizar um bloco try catch, parem e pensem se realmente ele é necessário no código.&lt;br /&gt;
Com esse post não estou dizendo que o try catch não deve ser utilizado, apenas quero que pensem quando realmente é necessário utiliza-lo.
&lt;br /&gt;
&lt;br /&gt;
Abaixo estou disponibilizando as classes utilizadas. O código fonte do projeto pode ser encontrado no link(&lt;b&gt;&lt;a href=&quot;https://sites.google.com/site/economizandobits/source_utilizandootrycatch/UtilizandoOTryCatch.rar&quot; target=&quot;_blank&quot;&gt;source&lt;/a&gt;&lt;/b&gt;) ou através do github em:
&lt;br /&gt;
https://github.com/fsaalmeidinha/trycatch.git
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Usuario.cs&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4719804.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;b&gt;Analisador.cs&lt;/b&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4719807.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;b&gt;Main.cs&lt;/b&gt;&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4719873.js&quot;&gt;&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://economizandobits.blogspot.com/feeds/4901051304070893042/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://economizandobits.blogspot.com/2013/02/c-utilizando-o-try-catch.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2713226685884564886/posts/default/4901051304070893042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2713226685884564886/posts/default/4901051304070893042'/><link rel='alternate' type='text/html' href='http://economizandobits.blogspot.com/2013/02/c-utilizando-o-try-catch.html' title='C# - Utilizando o Try Catch'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09335542647915962978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-IaKR_KCH-LbIq5Q7lg8YRlhB1OmJjWYP411KXAiv5NerPRkHWI9ZdAxvvdAuMLgsVmTMb-DXUrjJiNnxjymdSp0peMGeHLe8Z5n5WA_0Yx_UmVNbfXLu7BZv714bEAcXE773_2jBk6k/s72-c/resultado.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2713226685884564886.post-1526137189656941993</id><published>2013-02-01T13:38:00.005-08:00</published><updated>2013-02-06T20:01:38.884-08:00</updated><title type='text'>C# - O poder do StringBuilder</title><content type='html'>Olá, neste post, irei comentar um pouco sobre o poder do &lt;b&gt;StringBuilder&lt;/b&gt;.
&lt;br /&gt;
Quantas vezes não nos deparamos com situações no nosso código em que temos que concatenar strings inúmeras vezes?
&lt;br /&gt;
Ex:
Temos que gerar um relatório de quantas vezes cada usuário do sistema acessou o mesmo.
&lt;br /&gt;
Para exemplificar em quais momentos devemos utilizar o StringBuilder, desenvolvi o seguinte exemplo:
&lt;br /&gt;
&lt;br /&gt;
Criamos uma classe de Usuario que tem os seguintes métodos:&lt;br /&gt;
-List&amp;lt;Usuario&amp;gt; ListarUsuariosDoSistema(int qtdUsuarios)&lt;br /&gt;
simula a listagem dos usuários de um sistema, onde qtdUsuarios seria a quantidade de usuários que o sistema tem.&lt;br /&gt;
&lt;br /&gt;
-string GerarRelatorioAcessoAoSistema_UtilizandoStringBuilder(int qtdUsuarios)&lt;br /&gt;
-string GerarRelatorioAcessoAoSistema_SemUtilizarStringBuilder(int qtdUsuarios)&lt;br /&gt;
Cria o relatório,&lt;br /&gt;
&lt;span style=&quot;color: #2b91af; font-family: Consolas; font-size: 13px;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;background-color: white; font-family: Consolas; font-size: 13px;&quot;&gt;.Format(&lt;/span&gt;&lt;span style=&quot;color: #a31515; font-family: Consolas; font-size: 13px;&quot;&gt;&quot;Id:{0}&amp;nbsp;-&amp;nbsp;Nome:&amp;nbsp;{1}&amp;nbsp;-&amp;nbsp;Email:&amp;nbsp;{2}&amp;nbsp;-&amp;nbsp;Número&amp;nbsp;de&amp;nbsp;acessos:&amp;nbsp;{3}&quot;&lt;/span&gt;&lt;span style=&quot;background-color: white; font-family: Consolas; font-size: 13px;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: white; font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; usuarioSistema.Id,&amp;nbsp;usuarioSistema.Nome,&amp;nbsp;usuarioSistema.Email,&amp;nbsp;usuarioSistema.AcessosAoSistema)&amp;nbsp;&lt;/span&gt;, para cada um dos usuários do sistema.&lt;br /&gt;
&lt;br /&gt;
Simulamos então a geração do relatório utilizando o StringBuilder (GerarRelatorioAcessoAoSistema_&lt;b&gt;UtilizandoStringBuilder&lt;/b&gt;), passando o número de usuários do sistema = 10.&lt;br /&gt;
Fizemos o mesmo sem utilizar o StringBuilder (GerarRelatorioAcessoAoSistema_&lt;b&gt;SemUtilizarStringBuilder&lt;/b&gt;)&lt;br /&gt;
&lt;br /&gt;
Observamos então que o segundo método, sem a utilização do StringBuilder, foi 3 vezes mais veloz, demorando 0,00056 segundos, enquanto o outro método demorou 0,0024 segundos.&lt;br /&gt;
&lt;br /&gt;
Porém em muitos cenários, temos um número muito maior de registros, e nesses casos, o StringBuilder é essencial. Simulamos os mesmos exemplos com 1000 usuários e obtivemos os seguintes resultados:&lt;br /&gt;
comStringBuilder: 0,0051 segundos&lt;br /&gt;
semStringBuilder: 0,0987 segundos&lt;br /&gt;
Observamos então que o primeiro método, com a utilização do string builder, foi 15 vezes mais veloz.&lt;br /&gt;
&lt;br /&gt;
Fizemos um terceiro caso, com 10000 mil usuários, obtendo os seguintes resultados:&lt;br /&gt;
&lt;br /&gt;
comStringBuilder: 0,0630 segundos&lt;br /&gt;
semStringBuilder: 15,5369 segundos&lt;br /&gt;
Observamos então que o primeiro método, com a utilização do StringBuilder, foi 246 vezes mais veloz.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6jpzkTpMSkhrkMx_MBiEO5cP06dLVaRGahIzdPulA1XeeSXvJOl7cbJQhcc5zqysmCFQh7MPUoLHUbyP1sFw0L0D2Sto1JQyaNsYa38LpiXjdtLtDGGki-7DxYuZbB32xl0kVfKaCh4U/s1600/Console_resultados.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6jpzkTpMSkhrkMx_MBiEO5cP06dLVaRGahIzdPulA1XeeSXvJOl7cbJQhcc5zqysmCFQh7MPUoLHUbyP1sFw0L0D2Sto1JQyaNsYa38LpiXjdtLtDGGki-7DxYuZbB32xl0kVfKaCh4U/s640/Console_resultados.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Percebemos que para casos com pouca concatenação, o uso do StringBuilder tem um desempenho pior, porém quanto maior o número de concatenações, o StringBuilder se torna milhares de vezes mais eficiente do que a concatenação de strings, tanto em questão de tempo como em questão de memória. Isso ocorre por que ao concatenar 2 strings, uma nova instancia de string é criada para suportar o novo valor(uma string é um array de char com tamanho fixo, portanto ao mudar o tamanho da string, uma nova instancia de &#39;array de char&#39; deve ser criada). Já o StringBuilder trabalha de uma forma diferente, fazendo com que não seja necessário criar uma nova instancia de string.&lt;br /&gt;
&lt;br /&gt;
Abaixo, estou disponibilizando as classes utilizadas para os testes acima, o código fonte pode ser baixado através do link(&lt;a href=&quot;https://sites.google.com/site/economizandobits/source_opoderdostringbuilder/PoderDoStringBuilder.rar&quot; target=&quot;_blank&quot;&gt;source&lt;/a&gt;) ou através do git hub em:
&lt;br /&gt;
https://github.com/fsaalmeidinha/poderdostringbuilder.git
&lt;br /&gt;
&lt;br /&gt;
Comentem se gostaram ou não, dúvidas, como posso melhorar...
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Usuario.cs
&lt;/b&gt;&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4719764.js&quot;&gt;&lt;/script&gt;
&lt;br /&gt;
&lt;b&gt;Analisador.cs
&lt;/b&gt;&lt;script src=&quot;https://gist.github.com/fsaalmeidinha/4719775.js&quot;&gt;&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://economizandobits.blogspot.com/feeds/1526137189656941993/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://economizandobits.blogspot.com/2013/02/o-poder-do-stringbuilder.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2713226685884564886/posts/default/1526137189656941993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2713226685884564886/posts/default/1526137189656941993'/><link rel='alternate' type='text/html' href='http://economizandobits.blogspot.com/2013/02/o-poder-do-stringbuilder.html' title='C# - O poder do StringBuilder'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09335542647915962978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6jpzkTpMSkhrkMx_MBiEO5cP06dLVaRGahIzdPulA1XeeSXvJOl7cbJQhcc5zqysmCFQh7MPUoLHUbyP1sFw0L0D2Sto1JQyaNsYa38LpiXjdtLtDGGki-7DxYuZbB32xl0kVfKaCh4U/s72-c/Console_resultados.png" height="72" width="72"/><thr:total>0</thr:total></entry></feed>