Médio C#
Agrupar vendas por vendedor
Enunciado
Dada uma lista de vendas com Vendedor e Valor, use LINQ para agrupar as vendas por vendedor e exibir, para cada vendedor, o total vendido e a quantidade de vendas. Ordene os grupos pelo total decrescente.
Requisitos
- Use
GroupBypara agrupar porVendedor. - Calcule o total (
Sum) e a quantidade (Count) de cada grupo. - Ordene os grupos pelo total decrescente.
- Exiba no formato
Vendedor: Total = R$ X, Quantidade = Y.
Código inicial
using System;
using System.Linq;
using System.Collections.Generic;
class Venda
{
public string Vendedor { get; set; }
public decimal Valor { get; set; }
}
class Program
{
static void Main()
{
var vendas = new List<Venda>
{
new Venda { Vendedor = "Ana", Valor = 100 },
new Venda { Vendedor = "Bruno", Valor = 200 },
new Venda { Vendedor = "Ana", Valor = 150 },
new Venda { Vendedor = "Carlos", Valor = 300 },
new Venda { Vendedor = "Bruno", Valor = 50 }
};
// Seu código LINQ aqui
}
}
Saída esperada
Carlos: Total = R$ 300,00, Quantidade = 1
Bruno: Total = R$ 250,00, Quantidade = 2
Ana: Total = R$ 250,00, Quantidade = 2
Ver dica
Agrupe com GroupBy(v => v.Vendedor), depois projete com Select usando g.Sum(...) e g.Count(). Ordene com OrderByDescending.
Mostrar solução
using System;
using System.Linq;
using System.Collections.Generic;
class Venda
{
public string Vendedor { get; set; }
public decimal Valor { get; set; }
}
class Program
{
static void Main()
{
var vendas = new List<Venda>
{
new Venda { Vendedor = "Ana", Valor = 100 },
new Venda { Vendedor = "Bruno", Valor = 200 },
new Venda { Vendedor = "Ana", Valor = 150 },
new Venda { Vendedor = "Carlos", Valor = 300 },
new Venda { Vendedor = "Bruno", Valor = 50 }
};
// Agrupa por vendedor e calcula total e quantidade
var resumo = vendas
.GroupBy(v => v.Vendedor)
.Select(g => new
{
Vendedor = g.Key,
Total = g.Sum(v => v.Valor),
Quantidade = g.Count()
})
.OrderByDescending(x => x.Total);
foreach (var item in resumo)
Console.WriteLine($"{item.Vendedor}: Total = R$ {item.Total:F2}, Quantidade = {item.Quantidade}");
}
}
Passo a passo
- Definimos a classe
VendacomVendedoreValor. GroupBy(v => v.Vendedor)cria grupos onde a chave é o nome do vendedor.Selectprojeta cada grupo em um objeto anônimo comVendedor,Total(soma dos valores) eQuantidade(contagem de vendas).OrderByDescending(x => x.Total)ordena os grupos do maior total para o menor.- O
foreachimprime cada linha formatada com duas casas decimais.
Por que funciona
GroupBy retorna uma sequência de IGrouping<TKey, TElement>, que implementa IEnumerable<TElement>. Isso permite chamar Sum e Count diretamente em cada grupo. A ordenação posterior atua sobre os resultados agregados, não sobre as vendas originais.
Erros comuns
- Tentar acessar
g.Vendedorem vez deg.Key: a chave do grupo é acessada porKey. - Esquecer o
using System.Linq;: os métodosGroupBy,Sum,Countnão são encontrados. - Usar
OrderByem vez deOrderByDescending: a ordem ficaria crescente, contrariando o enunciado.
Outra forma de resolver
Com sintaxe de consulta:
var resumo = from v in vendas
group v by v.Vendedor into g
orderby g.Sum(x => x.Valor) descending
select new
{
Vendedor = g.Key,
Total = g.Sum(x => x.Valor),
Quantidade = g.Count()
};
É preferível quando há muitas cláusulas e a legibilidade fica melhor.
Saída esperada
Carlos: Total = R$ 300,00, Quantidade = 1
Bruno: Total = R$ 250,00, Quantidade = 2
Ana: Total = R$ 250,00, Quantidade = 2