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 GroupBy para agrupar por Vendedor.
  • 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

  1. Definimos a classe Venda com Vendedor e Valor.
  2. GroupBy(v => v.Vendedor) cria grupos onde a chave é o nome do vendedor.
  3. Select projeta cada grupo em um objeto anônimo com Vendedor, Total (soma dos valores) e Quantidade (contagem de vendas).
  4. OrderByDescending(x => x.Total) ordena os grupos do maior total para o menor.
  5. O foreach imprime 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.Vendedor em vez de g.Key: a chave do grupo é acessada por Key.
  • Esquecer o using System.Linq;: os métodos GroupBy, Sum, Count não são encontrados.
  • Usar OrderBy em vez de OrderByDescending: 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