C# - LINQ prático e rápido


Vou mostrar como usar os recursos do LINQ na linguagem C# de forma bem objetiva com um enfoque essencialmente prático dando o mínimo de teoria possível.

Vou adotar o estilo problema/solução onde é apresentando um problema e em seguida mostrado uma das soluções possíveis no caso usando LINQ.

1- Como selecionar itens a partir de uma coleção (XML ou database) ?

A plataforma .NET permite que usamos o LINQ para consultar arrays, coleções, documentos XML e banco de dados praticamente da mesma forma.

Para resolver este problema vamos definir o nome do elemento variável e usá-lo como base para resolução do problema:

IEnumerable<meuTipo> meuEnum = from e in fonte_dados select e;

O tipo que for usado para referência da fonte de dados deve implementar a interface Generic.IEnumerable. Se usarmos uma matriz ou uma coleção genérica então basta usar as referências pertinentes:

IEnumerable<meuTipo> meuEnum = from e in array select e;
IEnumerable<meuTipo> meuEnum = from e in coleção select e;

Se estivermos usando uma árvore XML, podemos obter um IEnumerable da raiz XElement chamando o método Element. Para um DataTable podemos obter um IEnumerable chamando o método AsEnumerable:

IEnumerable<XElement> meuEnum = from e in root.Elements() select e;
IEnumerable<DataRow> meuEnum = from e in table.AsEnumerable() select e;

Obs: Observe que o tipo genérico do resultado vai depender da fonte de dados.

Se você quiser selecionar um valor contido em um elemento da fonte de dados basta especificar o valor desejado após a palavra-chave select:

IEnumerable<string> meuEnum = from e in fonte_dados select e.Name;

A interface IEnumberable<> pode ser usada em um laço foreach para enumerar os resultados de uma consulta pois a consultas LINQ retornam instâncias de IEnumerable<> e uma fonte de dados para o LINQ deve implementar IEnumerable.

Vejamos então um exemplo prático aplicando o LINQ para realizar consultas em uma coleção.

Abra o Visual C# Express Edition e crie um novo projeto do tipo Console Application com o nome Usando_LINQ;

using System;
using System.Collections.Generic;
using System.Linq;

namespace LINQ_Pratico1
{
    class Program
    {
        static void Main(string[] args)
        {
          
 // Cria os dados
        
   IList<Fruta> fonteDados = criaDados();
          
 // Filtra baseado em uma única característica
            IEnumerable<string> resultado1 = from e in fonteDados
                                                                         where e.Cor == "vermelha"
                                                                         select e.Nome;


            Console.WriteLine("Filtrar por fruta - vermelha");
            foreach (string str in resultado1)
            {
                Console.WriteLine("Fruta {0}", str);
            }

           
// Filtro usando o operador >
            IEnumerable<Fruta> resultado2 = from e in fonteDados
                                                                       where e.Preco > 5
                                                                       select e;


            Console.WriteLine("\nFiltrar para preco > 5");
            foreach (Fruta Fruta in resultado2)
            {
                Console.WriteLine("Fruta {0}", Fruta.Nome);
            }

          
 // Filtra usando duas caracteristicas
             IEnumerable<string> resultado3 = from e in fonteDados
                                                                          where e.Cor == "verde"
                                                                          && e.Preco > 5
                                                                          select e.Nome;

            Console.WriteLine("\nFiltrar para Fruta verde e preco > 5");       
            foreach (string str in resultado3)
            {
                Console.WriteLine("Fruta {0}", str);
            }

            //
           
// Aguarda para continuar.
            Console.WriteLine("\nOperação concluída. Pressione Enter");
            Console.ReadLine();
        }
      
 /// <summary>
        /// criaDados -cria uma coleção de frutas
        /// </summary>
        /// <returns></returns>

        static IList<Fruta> criaDados()
        {
          return new List<Fruta>()
          {
             new Fruta("maça", "verde", 7),
             new Fruta("laranja", "laranja", 10),
             new Fruta("uva", "verde", 4),
             new Fruta("figo", "marrom", 12),
             new Fruta("ameixa", "vermelha", 2),
             new Fruta("banana", "amarela", 10),
             new Fruta("morango", "vermelha", 7)
           };
        }
      
 /// <summary>
        /// Fruta - defina a classe fruta com: nome ,cor e preco
        /// </summary>

        class Fruta
        {
         
  public Fruta(string namearg, string corarg, int precoarg)
            {
               Nome = namearg;
               Cor = corarg;
               Preco = precoarg;
            }

           
public string Nome { get; set;}
            public string Cor { get; set;}
            public int Preco { get; set;}

         }
    }
}

Podemos obter o mesmo resultado de uma maneira mais simples e é isso que eu vou mostrar no próximo artigo. Aguarde :

LINQ - Prático e rápido II

Eu sei é apenas LINQ, mas eu gosto...

Referências:

José Carlos Macoratti