0Pricing
C# Academy · Aula

Agregações e ToList

Conte, some e materialize

Agregações e ToList é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 4 aulas no total.

Contando elementos

Count retorna o número de elementos de uma sequência. Com um predicado, ele conta apenas os elementos correspondentes.

Ele força a enumeração, então toda a sequência é percorrida para produzir o total — uma operação de agregação.

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4, 5 };
Console.WriteLine(nums.Count());
Console.WriteLine(nums.Count(n => n > 2));

Somando valores

Sum soma valores numéricos. Em uma sequência numérica, ele soma os elementos; com um seletor, soma um valor projetado de cada elemento.

Ele retorna o mesmo tipo numérico da fonte ou do resultado do seletor.

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

record Order(int Qty, decimal Price);
var orders = new List<Order> { new(2, 5m), new(3, 4m) };
decimal total = orders.Sum(o => o.Qty * o.Price);
Console.WriteLine(total);

Calculando médias

Average calcula a média aritmética. Assim como Sum, ele aceita um seletor opcional.

O resultado é um tipo de ponto flutuante, como double, mesmo quando a fonte contém inteiros, para que nenhuma precisão seja perdida na divisão.

using System;
using System.Linq;

int[] scores = { 80, 90, 100 };
double avg = scores.Average();
Console.WriteLine(avg);

Mínimo e máximo

Min e Max retornam os menores e os maiores valores. Com um seletor, eles reduzem uma chave projetada.

Nas versões modernas do .NET, MaxBy e MinBy retornam o elemento inteiro com a chave extrema, e não apenas o valor da chave.

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

record P(string Name, int Age);
var ps = new List<P> { new("Ana", 30), new("Bo", 22) };
var oldest = ps.MaxBy(p => p.Age);
Console.WriteLine(oldest!.Name);

Problemas com sequências vazias

Em uma sequência vazia, Average, Min e Max sobre tipos de valor lançam InvalidOperationException. Sum retorna zero, e Count retorna zero.

Use Any() como proteção ou use DefaultIfEmpty antes de calcular a média de dados que podem estar vazios.

using System;
using System.Linq;

int[] empty = Array.Empty<int>();
double avg = empty.DefaultIfEmpty(0).Average();
Console.WriteLine(avg);

Aggregate para reduções personalizadas

Aggregate reduz uma sequência a um único valor usando uma função acumuladora. Ele é a forma geral por trás de Sum e de outras operações.

Você pode fornecer um valor inicial e combinar cada elemento com um resultado acumulado — algo útil para produtos, concatenações ou lógica personalizada.

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4 };
int product = nums.Aggregate(1, (acc, n) => acc * n);
Console.WriteLine(product);

Materializando com ToList

ToList executa a consulta imediatamente e copia os resultados para uma List<T>. Isso interrompe intencionalmente a execução adiada.

Use-o para obter uma cópia estável, evitar a repetição de um pipeline caro ou ter recursos de lista, como indexação e a propriedade Count.

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4 };
var evens = nums.Where(n => n % 2 == 0).ToList();
evens.Add(6);
Console.WriteLine(string.Join(", ", evens));

ToArray e ToDictionary

Outros materializadores relacionados incluem ToArray, que cria uma matriz de tamanho fixo, e ToDictionary, que permite consultas baseadas em chaves.

ToDictionary recebe um seletor de chave e, opcionalmente, um seletor de valor; ele lança uma exceção se dois elementos produzirem a mesma chave.

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

record P(string Name, int Age);
var ps = new List<P> { new("Ana", 30), new("Bo", 22) };
var byName = ps.ToDictionary(p => p.Name, p => p.Age);
Console.WriteLine(byName["Ana"]);

Por que materializar

Consultas adiadas são executadas novamente sempre que são iteradas. Se um pipeline for caro ou ler uma fonte que muda, essa repetição causará erros e lentidão.

Chamar ToList uma vez captura os resultados, para que as leituras posteriores sejam rápidas e consistentes.

using System;
using System.Linq;

int runs = 0;
int[] nums = { 1, 2, 3 };
var list = nums.Select(n => { runs++; return n; }).ToList();
foreach (var _ in list) { }
foreach (var _ in list) { }
Console.WriteLine(runs);

First, elemento único e Any

Os operadores de elementos também forçam a execução. First retorna a primeira correspondência, lançando uma exceção se não houver nenhuma; FirstOrDefault retorna um valor padrão; e Single exige exatamente um elemento.

Any informa se uma sequência contém algum elemento correspondente, sem contar todos eles.

using System;
using System.Linq;

int[] nums = { 3, 8, 5, 12 };
int firstBig = nums.First(n => n > 7);
bool hasOdd = nums.Any(n => n % 2 == 1);
Console.WriteLine($"{firstBig} {hasOdd}");

Pipeline completo

Consultas reais encadeiam filtragem, projeção, ordenação e agregação, muitas vezes terminando em um materializador.

Leia de cima para baixo: filtre, defina o formato, ordene e depois reúna os resultados. O ToList final executa todo o pipeline uma vez.

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

record Sale(string City, int Amt);
var sales = new List<Sale> { new("NY", 5), new("LA", 3), new("NY", 9) };
var top = sales.Where(s => s.Amt > 4)
               .OrderByDescending(s => s.Amt)
               .Select(s => s.City)
               .ToList();
Console.WriteLine(string.Join(", ", top));

Verificação rápida

Reflita sobre execução adiada e materialização.

Recapitulação

Agregações reduzem uma sequência a um valor: Count, Sum, Average, Min/Max, MinBy/MaxBy e o Aggregate geral. Elas forçam a execução e podem lançar exceções em fontes vazias.

ToList, ToArray e ToDictionary materializam os resultados, interrompendo o adiamento para que um pipeline caro seja executado uma única vez. Isso conclui o conjunto de ferramentas do LINQ para filtragem e projeção.

Perguntas Frequentes

A aula “Agregações e ToList” é grátis?

Sim — o texto completo de “Agregações e ToList” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 4 aulas no total.

O que vou aprender em “Agregações e ToList”?

Conte, some e materialize Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C# Academy?

Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Agregações e ToList”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C# Academy?

Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. WHERE e filtragem
  2. SELECT e projeção
  3. OrderBy e agrupamento
  4. Agregações e ToList
← Voltar para C# Academy