Início > C# > Trabalhando com Linq e C# – Parte 3

Trabalhando com Linq e C# – Parte 3


Continuando nosso estudo sobre o Linq com o C#, irei mostrar agora como resolver uma situação onde precisamos agrupar os campos, neste caso podemos fazer da seguinte maneira:

List<Pessoa> listaPessoa = CarregarLista();

var listaAgrupada = listaPessoa.GroupBy(pessoa => pessoa.Idade);

foreach(var pessoasIdade in listaAgrupada)

{

   MessageBox.Show(pessoasIdade.Key.ToString());

   foreach(var pessoaIdade in pessoasIdade)

   {

      MessageBox.Show(pessoaIdade.Nome +" " + pessoaIdade.SobreNome);

   }

}

 

Repare que o conjunto enumerável retornado pelo GroupBy contém todos os campos na coleção fonte original, mas as linhas são ordenadas em um conjunto de coleções enumeráveis com base no campo identificado pelo método especificado pelo GroupBy, no nosso exemplo pessoa.Idade é um conjunto de Idade, ou seja Idade é a chave do grupo, por isso usamos a exibição do valor do primeiro MessageBox como pessoasIdade.Key, e em seguida acessamos as linhas da Idade(Grupo de linhas) através de um outro Foreach para pegar os campos Nome e SobreNome que referenciam o Grupo.

Junção de dados; Assim como a SQL, a Linq permite fazer junção de múltiplos conjuntos de dados, ou seja, imagine queremos fazer um join entre a lista de pessoas e a lista de endereços, e para cada pessoa associar este a um endereço, podemos fazer isso da seguinte maneira:

Crie uma nova classe no seu projeto, coloque o nome como Endereco e implemente  três propriedades, sendo elas: Cidade, Estado e Bairro, conforme o código abaixo:

public class Endereco

{

   public string Cidade { get; set; }

   public string Estado { get; set; }

   public string Bairro { get; set; }
  
public string NomePessoa { get; set; }

}

 

Em seguida, crie um método dentro do seu formulário para fazer o preenchimento de uma lista desta entidade (Endereço) para que possamos utilizar em nosso exemplo, deixe conforme código abaixo:

private static List<Endereco> CarregarEndereco()

{

  List<Endereco> listaEndereco = new List<Endereco>()

  {

     new Endereco(){Cidade = "São Paulo", Estado = "SP", Bairro = "Jabaquara", NomePessoa="José"},

     new Endereco(){Cidade = "Franca", Estado = "SP", Bairro = "Paulistano", NomePessoa="Marcos"},

     new Endereco(){Cidade = "Maringa", Estado = "PR", Bairro = "Lima", NomePessoa="Augusto"}

  };

return listaEndereco;

}

 

Repare que na classe Endereço criamos uma propriedade chamada NomePessoa, esta propriedade irá armazenar o nome da pessoa que esta vinculado aquele endereço, em um mundo real você poderia ter mapeamento de objetos relacionais, como o SQL (Primary Key, Foreing key), mas por se tratar apenas de um exemplo iremos implementar desta maneira.

Veja o exemplo abaixo de como fazer um Join entre a classe pessoa e a classe endereço:

List<Endereco> listaEndereco = CarregarEndereco();

List<Pessoa> listaPessoa = CarregarLista();

var pessoaEndereco = listaPessoa.Select(pessoa => new { pessoa.Nome, pessoa.SobreNome, pessoa.Idade })

      .Join(listaEndereco, pessoa => pessoa.Nome, endereco => endereco.NomePessoa, (pessoa, endereco) =>

new { pessoa.Nome, pessoa.SobreNome, endereco.Cidade, endereco.Estado });

 

foreach (var linha in pessoaEndereco)

{

   MessageBox.Show(linha.Nome+" "+linha.SobreNome +"  -"+linha.Cidade +"-"+linha.Estado);

}

 

Neste exemplo, estamos fazendo uma seleção de dados da classe pessoa, porém agora com um Join através das chaves comuns (Pessoa.Nome e Endereco.NomePessoa). O método select especifica os campos de interesse de pessoa (Nome, Sobrenome e Idade), já o método Join faz a junção da coleção enumerável contendo os campos Nome, Sobrenome  da classe pessoa e Cidade e Estado da classe Endereço, os dois conjuntos (pessoa,endereço) são unidos pelo campos comuns e uma nova lista desta junção é devolvida.

Bom por hoje é só, posteriormente estaremos falando de outras funcionalidades do Linq, como a possibilidade de consultas, espero que estas 3 post´s ajude você em seu desenvolvimento, qualquer duvida pode deixar um comentário no blog.

Mais detalhes:

http://msdn.microsoft.com/pt-br/library/bb397676.aspx

http://msdn.microsoft.com/pt-br/library/bb882647.aspx

 

Abraço,

Categorias:C#
  1. Adriano
    2 de outubro de 2009 às 20:54

    Nelson, não sei se lembra de mim. Fizemos um curso em Ribeirão na Center Cursos em 2007.Você ainda continua em Franca?Parceiro esse seu artigo sobre LINQ ficou show de bola, principalmente essa parte de manipular listas utilizando expressões lambda, é bem mais simples do que ficar usando Delegates.Estou sempre lendo os artigos no seu BlogAté.

  1. No trackbacks yet.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: