No contexto de bancos de dados, as funções de agregação são usadas para resumir e calcular valores a partir de um conjunto de dados. Elas são essenciais para obter informações gerais e estatísticas, como somas, médias, máximos e mínimos. Exemplos comuns incluem funções como “SUM”, “AVG”, MAX” e “MIN”, que ajudam a transformar dados brutos em informações úteis.
Em C#, o LINQ (Language Integrated Query) oferece suporte a essas mesmas operações de agregação, mas integradas diretamente à linguagem. Com o LINQ, você pode aplicar métodos de agregação a coleções de dados de maneira intuitiva e eficiente. Neste artigo, vamos explorar esses métodos com exemplos práticos, demonstrando como utilizá-los para obter resultados específicos de maneira eficiente. Caso queira saber mais sobre métodos do LINQ, você pode acessar os artigos sobre “Três métodos LINQ essenciais para o desenvolvedor .NET” e “Métodos para recuperar um único registro no LINQ”.
Max
O método Max é utilizado para encontrar o maior valor em uma coleção de dados. O tipo de retorno desse método depende do tipo da coleção em que é aplicado. Por exemplo, se a coleção é de números inteiros, o retorno será um inteiro; se for de objetos, o retorno será um objeto. Esse método é útil em diversos cenários, como encontrar o preço mais alto de um produto ou o maior valor em uma lista de números.
List numeros = new List { 10, 50, 30, 40, 20 };
int valorMaximo = numeros.Max();
Console.WriteLine($"O maior valor é: {valorMaximo}");
No exemplo acima, será retornado o valor 50, que é o maior elemento da lista. O método Max do LINQ é equivalente à função MAX no SQL, que é utilizada para encontrar o maior valor em uma coluna de uma tabela.
Min
O método Min funciona como o oposto do método Max, encontrando o menor valor em uma coleção. Isso pode ser útil para determinar, por exemplo, a data da primeira compra de um cliente, o início de um período específico, o menor valor de uma lista de produtos, etc.
List datas = new List
{
new DateTime(2024, 3, 12),
new DateTime(2024, 4, 21),
new DateTime(2024, 2, 7)
};
var primeiraData = datas.Min();
Console.WriteLine($"A primeira data é: {primeiraData.ToShortDateString()}");
Aqui, criamos um array de DateTime e após isso aplicamos o método Min para encontrar a menor data, que neste caso é 7 de fevereiro de 2024. É fácil perceber que este método se assemelha à função MIN da linguagem SQL.
MaxBy e MinBy
Enquanto os métodos Max e Min são úteis para encontrar valores máximos e mínimos avaliando o valor do próprio item da coleção como um todo, os métodos MaxBy e MinBy permitem encontrar o elemento completo que possui o valor máximo ou mínimo em uma determinada propriedade. Isso é particularmente útil quando você deseja obter o objeto completo que atende ao critério, e não apenas o valor avaliado. Por exemplo:
List pessoas = new List
{
new Pessoa { Nome = "Ana", Idade = 25 },
new Pessoa { Nome = "Carlos", Idade = 30 },
new Pessoa { Nome = "Bianca", Idade = 28 }
};
Pessoa pessoaMaisVelha = pessoas.MaxBy(p => p.Idade);
Pessoa pessoaMaisJovem = pessoas.MinBy(p => p.Idade);
Console.WriteLine($"Pessoa mais velha: {pessoaMaisVelha.Nome}");
Console.WriteLine($"Pessoa mais jovem: {pessoaMaisJovem.Nome}");
No código acima, especificamos que queríamos encontrar a pessoa com a maior e a menor idade na lista usando a idade como parâmetro. A pessoa com a maior idade é o Carlos, com 30 anos e a mais jovem é a Ana, com 25 anos
Count
O método Count nos permite determinar o número de elementos em uma coleção. Ele pode ser usado de duas formas: para contar todos os elementos ou para contar apenas aqueles que atendem a um critério específico. O tipo de retorno desse método é um int, que representa a quantidade de itens contados.
Para contar todos os elementos de uma coleção, você pode usar o método Count sem passar nenhum parâmetro. Esse uso é equivalente à função COUNT(*) no SQL, que conta todas as linhas de uma tabela.
List numeros = new List { 10, 20, 30, 40, 50 };
int totalNumeros = numeros.Count();
Console.WriteLine($"Total de números: {totalNumeros}");
Neste caso, a variável totalNumeros receberá o valor 5, que é a quantidade de itens na lista.
Para contar apenas os elementos que atendem a um critério específico, você pode usar uma expressão lambda como parâmetro do método Count. Essa abordagem é equivalente à função COUNT com uma cláusula WHERE no SQL, que conta o número de linhas que satisfazem uma condição.
List pedidos = new List
{
new Pedido { Id = 1, Status = "Entregue" },
new Pedido { Id = 2, Status = "Pendente" },
new Pedido { Id = 3, Status = "Entregue" },
new Pedido { Id = 4, Status = "Cancelado" }
};
int quantidadePedidosEntregues = pedidos.Count(p => p.Status == "Entregue");
Console.WriteLine($"Quantidade de pedidos entregues: {quantidadePedidosEntregues}");
Em nosso exemplo, apenas dois pedidos estão registrados como entregues
Sum
O método Sum é utilizado para calcular a soma dos valores em uma coleção. Dependendo do tipo de coleção e dos elementos que ela contém, você pode usar o método Sum de duas maneiras: para somar todos os valores diretamente ou para somar apenas uma propriedade específica dos objetos da lista. O tipo de retorno desse método é um decimal, int, ou outro tipo numérico, conforme o tipo dos elementos da coleção.
Para calcular a soma de todos os valores em uma coleção, você pode usar o método Sum diretamente sem passar nenhum parâmetro. Esse uso é equivalente à função SUM no SQL, que calcula a soma de uma coluna de uma tabela.
List valores = new List { 10, 20, 30, 40, 50 };
int totalValores = valores.Sum();
Console.WriteLine($"A soma dos valores é: {totalValores}");
No exemplo acima o Sum retornará o valor 150.
Já para calcular a soma de uma propriedade específica, você pode passar uma expressão lambda como parâmetro para o método Sum:
List vendas = new List
{
new Venda { Valor = 1000 },
new Venda { Valor = 2000 },
new Venda { Valor = 1500 }
};
decimal totalVendas = vendas.Sum(v => v.Valor);
Console.WriteLine($"O total de vendas é: {totalVendas}");
No exemplo acima o Sum retornará a soma da propriedade Valor dos objetos do tipo Venda, resultando em 4500.
Average
Por fim, o método Average é utilizado para calcular a média dos valores em uma coleção. Esse método é particularmente útil para cenários onde você precisa encontrar a média de um conjunto de dados, como a média das notas dos alunos em uma turma. O tipo de retorno desse método é um double, representando a média calculada.
Para calcular a média de todos os valores em uma coleção, você pode usar o método Average diretamente, sem passar parâmetros. Esse uso é equivalente à função AVG no SQL, que calcula a média de uma coluna de uma tabela.
List notas = new List { 8.3, 9.8, 8.5, 7.4, 7.5 };
double media = notas.Average();
Console.WriteLine($"A média das notas é: {media}");
A média das notas do aluno é de: 8.5.
Para calcular a média de uma propriedade específica dentro de uma coleção de objetos, você pode usar uma expressão lambda como parâmetro:
List vendas = new List
{
new Venda { ValorTotal = 1000 },
new Venda { ValorTotal = 2000 },
new Venda { ValorTotal = 1500 }
};
double mediaVendas = vendas.Average(v => v.ValorTotal);
Console.WriteLine($"A média dos valores das vendas é: {mediaVendas}");
No exemplo acima, calculamos a média dos valores das vendas, que é de 1500.
Acelere a sua carreira conosco!
Se você é Desenvolvedor .NET Júnior e quer acelerar sua carreira até nível Pleno com salário de R$7k+, ou mesmo busca a primeira vaga, conheça a Mentoria .NET Start: Clique aqui
Se é Desenvolvedor .NET Pleno ou Sênior e quer virar referência técnica em sua equipe e mercado, com salário de R$10k+, conheça a Mentoria .NET Expert: Clique aqui
Conclusão
Os métodos de agregação no LINQ são essenciais para realizar cálculos e obter resumos de dados em coleções. Com os esses métodos você pode facilmente realizar operações complexas de maneira simples e eficiente. Com a prática e a exploração dessas métodos, você será capaz de manipular e analisar dados de forma mais eficaz em suas aplicações C#.