C# - Como funciona o agrupamento com Group by da LINQ


No artigo de hoje veremos como funciona o agrupamento de dados usando a cláusula Group da LINQ.


O agrupamento de dados feito via SQL é diferente do agrupamento realizado usando consultas LINQ com a cláusula Group.


 

O agrupamento é um dos recursos mais poderosos do LINQ, e, podemos agrupar dados da seguintes formas:

Na LINQ, a cláusula group funciona da seguinte maneira:

Assim, no grupamento feito pelo group by da LINQ podemos obter os elementos individuais, visto que é criado uma sequência de grupos e esses grupos implementam IGrouping<Tkey,T) no qual TKey é o atributo usado para fazer o agrupamento e T representa a entidade original.

 

Vejamos isso funcionando na prática em um projeto do tipo Console criado no VS 2017 Community.

 

recursos usados:

Criando o projeto e usando Group by da LINQ

 

Vamos iniciar com um exemplo onde vamos usar a sintaxe de consulta - Query Sintax - em um projeto Console chamado CShp_LINQ_Group;

 

Vamos criar uma classe Aluno no projeto com o código abaixo:

 

 public class Aluno
    {
        public int AlunoId { get; set; }
        public string Nome { get; set; }
        public char Sexo { get; set; }
        public string Curso { get; set; }
    }

 

 

A seguir na classe Program inclua o código abaixo:

 

using System.Collections.Generic;
using System.Linq;
using static System.Console;
namespace CShp_LINQ_Group
{
    class Program
    {
        private static IList<Aluno> listaAlunos = GetAlunos();
        static List<Aluno> GetAlunos()
        {
          List<Aluno> alunos =  new List<Aluno>() {
          new Aluno() { AlunoId = 1, Curso = "Fisica", Nome = "Vitor", Sexo ='M' },
          new Aluno() { AlunoId = 2, Curso = "Quimica", Nome = "Jorge", Sexo ='M' },
          new Aluno() { AlunoId = 3, Curso = "Engenharia", Nome = "Bernardo", Sexo ='M' },
          new Aluno() { AlunoId = 4, Curso = "Moda", Nome = "Danusa", Sexo ='F' },
          new Aluno() { AlunoId = 5, Curso = "Moda", Nome = "Carla", Sexo ='F' },
          new Aluno() { AlunoId = 6, Curso = "Fisica", Nome = "Helio", Sexo ='M' },
          new Aluno() { AlunoId = 7, Curso = "Engenharia", Nome = "Bianca", Sexo ='F' },
          new Aluno() { AlunoId = 8, Curso = "Quimica", Nome = "Vilma", Sexo ='F' },
          new Aluno() { AlunoId = 9, Curso = "Engenharia", Nome = "Amanda", Sexo ='F' },
          };
          return alunos;
        }
        static void Main(string[] args)
        {
            var listaAgrupada = from aluno in listaAlunos
                                     group aluno by aluno.Curso into cursoGrupo
                                     orderby cursoGrupo.Key ascending
                                     select cursoGrupo;
            foreach (var grupo in listaAgrupada)
            {
                WriteLine(string.Format($"Curso : {grupo.Key}"));
                foreach (var aluno in grupo)
                {
                    WriteLine($"\t {aluno.Nome} - {aluno.Sexo}");
                }
            }
            Read();
        }
    }
}

 

Note que na consulta estamos usando a palavra chave into que se comporta como uma variável de intervalo.

 

É como se tivéssemos uma segunda consulta após a palavra-chave into. Aqui estamos solicitando os dados obtidos na primeira parte, e a seguir, inserindo em cursoGrupo pela chave(Key) que é Curso.

 

Executando o projeto iremos obter :

 

 

Agrupando usando uma chave composta

 

Vamos agora realizar um novo agrupamento desta vez usando uma chave composta. Vamos agrupar os alunos pelo Curso e pelo sexo do aluno.

 

Usamos uma chave composta para agrupar elementos de acordo com mais de uma chave. Uma chave composta é criada usando um tipo anônimo ou nomeado para armazenar o elemento-chave.

 

Nosso código ficaria assim:

 

       private static void AgruparPorCursoLetraNome()
        {
            var listaAgrupada = from aluno in listaAlunos
                                      group aluno by new
                                      {
                                         aluno.Curso,
                                         aluno.Sexo
                                      };

            foreach (var grupo in listaAgrupada)
            {
                WriteLine(string.Format("Curso : {0}", grupo.Key.Curso, grupo.Key.Sexo));
                foreach (var aluno in grupo)
                {
                    WriteLine($"\t {aluno.Nome} - {aluno.Sexo}");
                }
            }
       }

 

Executando o projeto iremos obter:

 

 

Neste exemplo a cláusula group faz com que um grupo separado seja criado para cada conjunto de alunos com o mesmo curso e o mesmo sexo.

 

Pegue o código do projeto aqui: CShp_LINQ_Group.txt
 

"Guia-me na tua verdade, e ensina-me, pois tu és o Deus da minha salvação; por ti estou esperando todo o dia."
Salmos 25:5

 

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti