Por várias vezes observei muitos projetos sendo iniciados utilizando as novas versões
do Microsoft .NET framework, mas mantendo técnicas de programação
utilizadas nas versões mais antigas, ou seja, os novos recursos do
framework não são aproveitados.
Dentre
esses recursos, que ainda julgo pouco aproveitados, exemplificarei
aqui, de forma objetiva e simples, a utilização do “LINQ to
Objects” (Language Integrated Query) que, segundo definições da
própria Microsoft, consiste na execução
de “queries” semelhantes às escritas em SQL (Structured Query
Language) sobre coleções que implementam uma das interfaces
IEnumerable ou IEnumerable <T>.
O
Namespace utilizado nesse tipo de manipulação é o System.Linq,
que é importado por padrão em projetos criados utilizando o
.Net Framework 3.5 no Microsoft Visual Studio 2008 ou versões
posteriores. Esse tipo de abordagem propicia ao desenvolvedor um
amplo controle sobre as listas (filtrar, agrupar, etc.) diminuindo a
complexidade do código.
Criei o
exemplo abaixo com o intuito de mostrar uma visão geral sobre o
“LINQ to Objects” e despertar a curiosidade dos leitores que
ainda desconhecem esse recurso, não me preocupando ainda em detalhar
os métodos utilizados por ele. Farei isso nos próximos artigos. No pequeno aplicativo abaixo existe uma lista
do tipo “User” que é povoada com várias instâncias randômicas;
a partir desse ponto, diversas “queries” serão escritas a fim de
filtrar essa coleção e recuperar as instâncias de acordo com os
critérios que eu estabeleci.
A Coleção será criada com base nesse tipo
using System;<br />using System.Collections.Generic;<br />using System.Linq;<br />using System.Text;<br />namespace Linhadecodigo.Linq<br />{<br />public class User<br />{<br />private string name;<br />public string Name<br />{<br />get { return name; }<br />set { name = value; }<br />}<br />private DateTime birthDay;<br />public DateTime BirthDay<br />{<br />get { return birthDay; }<br />set { birthDay = value; }<br />}<br />/// <summary><br />/// Não se preocupe em retornar a idade correta do usuário.<br />/// Não é o objetivo do artigo.<br />/// </summary><br />public int Age<br />{<br />get<br />{<br />return DateTime.Now.Year - birthDay.Year;<br />}<br />}<br />private string homeTown;<br />public string HomeTown<br />{<br />get { return homeTown; }<br />set { homeTown = value; }<br />}<br />}<br />}Consultas
executadas sobre as listas
static List<User> listUsers = new List<User>();<br />static void Main(string[] args)<br />{<br />PopulateUsers();<br />// Recupera uma lista com os usuários que residem na cidade de Vitória.<br />IEnumerable<User> query1 = from users in listUsers<br />where users.HomeTown.Equals("Vitória",<br />StringComparison.InvariantCultureIgnoreCase)<br />orderby users.Name ascending<br />select users;<br />ShowUsers(query1);<br />// Recupera uma lista com a idade inferior aos 18 anos.<br />IEnumerable<User> query2 = from users in listUsers<br />where users.Age < 18<br />orderby users.Age descending<br />select users;<br />ShowUsers(query2);<br />// Recupera uma lista contabilizando os adultos agrupados por cidade.<br />var query3 = from users in listUsers<br />where users.Age > 18<br />group users by users.HomeTown into groupUsers<br />orderby groupUsers.Key ascending<br />select groupUsers;<br />ShowUsers(query3);<br />Console.ReadKey();<br />}
Método para
exibir as listas resultantes
/// <summary><br />/// Exibe a lista após aplicação dos filtros.<br />/// </summary><br />/// <param name="pQuery"></param><br />private static void ShowUsers(IEnumerable<User> pQuery)<br />{<br />IEnumerator<User> users = pQuery.GetEnumerator();<br />while (users.MoveNext())<br />{<br />Console.WriteLine();<br />Console.WriteLine(users.Current.Name);<br />Console.WriteLine(users.Current.BirthDay);<br />Console.WriteLine(users.Current.Age);<br />Console.WriteLine(users.Current.HomeTown);<br />Console.WriteLine();<br />}<br />Console.WriteLine("----------------------------------------------------");<br />}
Método para
exibir as listas resultantes (Sobrecarregado)
/// <summary><br />/// Exibe a lista após aplicação dos filtros.<br />/// </summary><br />/// <param name="pQuery"></param><br />private static void ShowUsers<T>(IEnumerable<IGrouping<T, User>> pQuery)<br />{<br />foreach (var users in pQuery)<br />{<br />Console.WriteLine();<br />Console.Write("Hometown: {0} Total de adultos: {1}", users.Key, users.Count());<br />Console.WriteLine();<br />}<br />Console.WriteLine("----------------------------------------------------");<br />}Método
responsável por popular a lista de usuários
/// <summary><br />/// "Popula" a lista com instâncias randômicas.<br />/// </summary><br />private static void PopulateUsers()<br />{<br />string[] homeTown = {<br />"Vitória", "Vila Velha", "Serra",<br />"Blumenau", "Florianópolis", "Salvador",<br />"Belo Horizonte", "Ipatinga"<br />};<br />Random randomValue = new Random();<br />for (int i = 0; i < 100; i++)<br />{<br />User user = new User<br />{<br />Name = "Usuario" + (i + 1),<br />BirthDay = new DateTime(randomValue.Next(1980, 2000),<br />randomValue.Next(1, 12),<br />randomValue.Next(1, 28)),<br />HomeTown = homeTown[randomValue.Next(homeTown.Length - 1)]<br />};<br />listUsers.Add(user);<br />}<br />}Espero
ter alcançado o meu objetivo, que era despertar no leitor o interesse
em pesquisar os novos recursos do Microsoft .Net Framework. Nos
próximos artigos abordarei o “LINQ to Objects” dando destaque a
cada um dos operadores listados na tabela abaixo:
Principais operadores do LINQ to Objects
| Categoria | Operador |
| Projection |
Select e SelectMany |
| Join |
Join e GroupJoin |
| Restriction | Where |
| Set |
All, Any, Concat, Contains, DefaultIfEmpty, Distinct, EqualAll, Except, Intersect, e Union |
| Grouping | GroupBy |
| Aggregate |
Aggregate, Average, Count, LongCount, Max, Min, e Sum |
| Paging |
ElementAt, First, FirstOrDefault, Last, LastOrDefault, Single, Skip, Take, TakeWhile |
*
Referência:
http://msdn.microsoft.com/en-us/library/bb397919.aspx







