Um assunto que está tendo bastante interesse na plataforma .Net é o LINQ. Há algum tempo atrás postei um artigo explicando como utilizar o LINQ to XML, uma variação do LINQ focada em XML. Neste artigo vamos mostrar como utilizar o LINQ com Arrays (matriz). Aproveitando o lançamento de um livro em português que fala 100% de LINQ, LINQ e C# 3.0, convidei o autor e MVP (Most Valuable Professional) Renato Haddad para escrevermos juntos este artigo.
Mas afinal, o que é o LINQ?
O LINQ (Language Integrated Query) é uma linguagem de consulta integrada a ser usada em coleções de dados. Tais coleções podem ser uma classe, um array ou uma coleção em si. A mídia tem divulgado o LINQ como sendo uma forma de pesquisar dados apenas em banco de dados. Isto está errado, pois se o banco de dados é representado num modelo de objeto relacional OR/M, então, temos uma consulta diretamente na classe. O que precisamos é que a fonte seja uma coleção ou um objeto do tipo IEnumerable ou IQueryable.
Veja um exemplo simples. Dado um array chamado números do tipo int contendo diversos números aleatórios sem nenhuma ordem de classificação, como você faria para ler todos os elementos do array? Vamos lá, abra o VS.NET 2008, crie um projeto de Console e codifique. Se não tiver um software, pegue um lápis, borracha e papel e monte o algoritmo pra isto.
Listagem 01: Criação de um array de números
int[] numeros = { 9, 4, 6, 5, 3, 8, 7, 0, 1, 2 };
Provavelmente você usaria um looping, afinal é apenas para ler cada elemento do array.
Listagem 02: Criação do Loop
foreach (var item in numeros)
{
Console.WriteLine(item + Environment.NewLine);
}
Agora, preciso que o resultado seja uma lista com apenas os números menores que sete (< 7). Obviamente basta inserir uma condição com um IF e pronto. Aqui já vi programadores classificarem os itens do array e lerem até satisfazer a condição. Lembre-se de que existem várias maneiras de codificar, por isto que programar é uma arte.
Listagem 03: Exibição do resultado
foreach (var item in numeros)
{
if(item < 7)
Console.WriteLine(item + Environment.NewLine);
}
Agora, veja o mesmo código como fica com o LINQ. Usei o “var” que é a interface do IEnumerable, ou seja, assume o tipo de dados conforme a expressão e criei a variável “resultado”. Com o LINQ você precisa informar o from n (variável n criada neste momento, o qual poderia ser qualquer outro nome) in (contido em) números (variável que contém o array) select n (seleciona os números extraídos na variável n). Em seguida, para exibir o resultado é só montar um looping baseado na variável resultado.
Listagem 04: Criação do Loop, com LINQ
var resultado = from n in numeros select n;
foreach (var item in resultado)
{
Console.WriteLine(item + Environment.NewLine);
}
E como fica o código para filtrar somente os números menores que 7? Basta adicionar o where n < 7 que é o filtro a ser aplicado. Quando se usa o select n, o resultado será apenas com os números filtrados.
Listagem 05: Filtro com LINQ
var resultado = from n in numeros
where n < 7
select n;
Outra forma que se pode aplicar o filtro é através de uma expressão Lambda onde a condição é o n => n < 7. Expressão Lambda é complicado de entender o funcionamento, mas depois que você pega o jeito não a troca por nada, além de ser muito mais rápido que qualquer outro tipo de consulta.
Listagem 06: Criação do Loop, com LINQ
var resultado = (from n in numeros select n).Where(n => n <7);
Bom, voltando ao primeiro exemplo deste artigo, como que você poderia classificar os números em ordem crescente? Bom, sem o LINQ não vou perder tempo com o código, isto fica pra você se divertir, eu prefiro usar o orderby n do LINQ, ou seja, com apenas uma cláusula já classifico os dados.
Listagem 07: Ordenando os resultados
var resultado = from n in numeros orderby n select n;
Se precisar colocar em ordem decrescente use o orderby n descending.
Listagem 08: Ordenando os resultados, com ASC e DESC
var resultado = from n in numeros orderby n descending select n;
Só para finalizar um exemplo bem fácil de aplicar sem perder muito tempo com o LINQ, veja que o array repetido contém vários números repetidos.
Sendo assim, monte um código para listar apenas os números únicos, ou seja, aqueles que não se repetem. Com o LINQ basta adicionar o Distinct(), isto mesmo, só isto.
Listagem 09: Select Distinct com LINQ
int[] repetidos = { 1, 1, 1, 2, 2, 2, 2, 7, 8, 9, 9};
var unicos = (from n in repetidos select n).Distinct();
foreach (var item in unicos)
{
Console.WriteLine(item + Environment.NewLine);
}
Conclusão
Use e abuse do LINQ, vai mudar a sua vida, deixando o código mais simples, claro, de fácil manutenção e o melhor de tudo, você irá escrever menos códigos.
Referências
- Página do LINQ
- Livro LINQ e C# 3.0 A Solução em Consultas para Desenvolvedores – Renato Haddad
Sobre o Autor do Livro – LINQ e C# 3.0
Renato Haddad (rehaddad@msn.com www.renatohaddad.com) é MVP, MCT, MCPD e MCTS, palestrante em eventos da Microsoft em diversos países, ministra treinamentos focados em produtividade com o VS.NET 2008, ASP.NET 3.5, LINQ, Reporting Services e Windows Mobile. Visite o blog http://weblogs.asp.net/renatohaddad. Renato é autor de diversos CDs de treinamentos e do livro LINQ e C# 3.0 A Solução em Consultas para Desenvolvedores.
Entrevistas com Renato Haddad no iMasters