mono + Linq

8 10 2008

Se você me pedir um pra citar um motivo que compense trabalhar com .net/mono eu respondo “Linq”.
Linq é a sigla de Language INtegrated Query, um recurso poderoso que permite você trabalhar com consultas dinâmicas no seu código fonte ao invés de enviar para alguma entidade externa (como um banco de dados por exemplo), você pode usar Linq em coleções de objetos (List, Arrays…) com arquivos XML e com banco de dados.
Vou tentar exemplificar de forma bem simples o funcionamento básico desse recurso.

Para iniciar o trabalho com Linq, é necessário incluir o namespace System.Linq;

using System.Linq;

Em seguida vamos definir uma estrutura de dados para trabalharmos.

struct pessoa {
  public string nome;
  public int idade;
  public pessoa(string aNome, int aIdade)
  {
    nome = aNome;
    idade = aIdade;
  }
  public string GetPessoa()
  {
    return "Nome: "+nome+" Idade: "+idade;
  }
}

Agora, já dentro de nossa classe de testes, declaramos uma lista de pessoas utilizando Generics (caso tenha alguma dificuldade com generics, veja estes exemplos
e também criamos um métodos que preenche nossa lista com dados fictícios e o método principal do teste (Main).

public class LinqTeste
{
        List<pessoa> lista ;
        public void PreencheLista()
        {
            lista = new List<pessoa>();
            lista.Add(new pessoa("Eustáquio",35));
            lista.Add(new pessoa("Siridonha",20));
            lista.Add(new pessoa("Severina" ,48));
            lista.Add(new pessoa("Gersoval" ,80));
        }

	static void Main()
	{
		LinqTeste lt = new LinqTeste();
		lt.ImprimeLista();
	}

O próximo método será nosso método de trabalho e se chamará ImprimeLista, ele servirá apenas pra mostrar nossos dados fictícios na tela, poderiamos implementá-lo da seguinte forma:

	public void ImprimeLista()
	{
                // Preenche a lista fictícia
		PreencheLista();
                // Imprime todos os valores da lista
		foreach (pessoa p in lista)
 		      Console.WriteLine(p.GetPessoa());
		Console.ReadKey();
	}

Compilando e executando esse programa, teriamos a lista de pessoas impressa na tela porém, e se você quiser imprimir a lista ordenada em ordem alfabética? ou por ordem de Idade?.

A forma tradicional de trabalharmos com ordenação de lista seria criarmos um método que implementa a interface IComparer, o problema é que pra cada campo do nosso registro teriamos que implementar um método ou então passar parâmetro para o método de ordenação indicando o campo a ser ordenado, o que tornaria o código um pouco trabalhoso de se entender. O Linq resolve esse tipo de problema exigindo que a pessoa tenha apenas um conhecimento básico de SQL. Veja a implementação do nosso método abaixo :

	public void ImprimeLista()
	{
		PreencheLista();
		// Cria uma lista ordenada pela Idade
		List<pessoa> id = (from pess in lista
					   orderby pess.idade
					   select pess).ToList<pessoa>();

		foreach (pessoa p in id)
			Console.WriteLine(p.GetPessoa());
		Console.ReadKey();
	}

Podemos observar que foi adicionada uma nova variável id que recebe o resultado de uma consulta feita sob a lista de pessoas. Linq é semelhante a SQL e uma das principais diferenças entre elas é que as consultas em Linq começam pela cláusula From indicando antecipadamente ao parser de onde os dados serão retirados.

Note também que estou convertendo o resutado da consulta em uma lista de pessoas, isso porque as cláusulas linq para consulta retornam um objeto que implementa IEnumerable, possibilitando essa conversão.

Caso queira ordenar a lista pelo nome basta trocar o ‘orderby pess.idade’ por ‘orderby pess.nome’, viu como é fácil?
Agora, digamos que precisamos exibir as pessoas com menos de 35 anos, nosso método ficaria assim:

	public void ImprimeLista()
	{
		PreencheLista();
		List<pessoa> id = (from pess in lista
					   where pess.idade <= 35
					   select pess).ToList<pessoa>();

		foreach (pessoa p in id)
			Console.WriteLine(p.GetPessoa());
		Console.ReadKey();
	}

Bem, esse post é apenas a “ponta do iceberg” das possibilidades que o Linq nos oferece, espero que tenham gostado.


Ações

Informações

Deixe um comentário