Voltar ao código C#

Ventas por mes con LINQ, sin un solo bucle

Agrupar, ordenar y totalizar una lista de ventas en una sola consulta legible.

Este post ainda não está no seu idioma; você o vê em espanhol. O código é o mesmo.

O problema

Tenés una lista de ventas en memoria y te piden el total y la cantidad de tickets por mes. Con bucles y diccionarios salen treinta líneas; con LINQ, una consulta.

C#
using System;
using System.Linq;

record Venta(DateTime Fecha, string Sucursal, decimal Monto);

class Programa {
    static void Main() {
        var ventas = new[] {
            new Venta(new DateTime(2026, 1, 15), "Centro", 1200m),
            new Venta(new DateTime(2026, 1, 28), "Norte",   800m),
            new Venta(new DateTime(2026, 2, 3),  "Centro", 1500m),
            new Venta(new DateTime(2026, 2, 19), "Centro",  700m),
        };

        var porMes = ventas
            .GroupBy(v => new { v.Fecha.Year, v.Fecha.Month })
            .OrderBy(g => g.Key.Year).ThenBy(g => g.Key.Month)
            .Select(g => new { Mes = $"{g.Key.Year}-{g.Key.Month:00}", Total = g.Sum(v => v.Monto), Tickets = g.Count() });

        foreach (var m in porMes)
            Console.WriteLine($"{m.Mes}: {m.Total,10:N2} en {m.Tickets} ventas");
    }
}

Por que está escrito assim

  1. GroupBy con un objeto anónimo agrupa por año y mes a la vez: enero de 2026 no se mezcla con enero de 2027.
  2. Cada grupo se comporta como una lista: por eso se le puede pedir Sum y Count.
  3. El dinero va en decimal (el sufijo m), nunca en double: los centavos no admiten redondeo binario.
  4. El formato {m.Total,10:N2} alinea a diez caracteres con dos decimales y separador de miles.
Como testar

dotnet new console -n Ventas, reemplazá Program.cs con este código y corré dotnet run.

Atenção

Sobre una lista en memoria esto es instantáneo. Sobre una base con Entity Framework, la misma consulta se traduce a SQL: revisá el SQL generado antes de confiar en que agrupa en el servidor.

Adapte ao seu caso com IA

O botão copia este prompt com o código colado abaixo. Substitua os colchetes pelo que é seu e cole no ChatGPT, Claude, Gemini ou Copilot.

O prompt
Tengo esta consulta LINQ que agrupa ventas por mes. Extendela para que además agrupe por [SEGUNDA DIMENSIÓN: sucursal, vendedor, categoría], calcule la variación porcentual contra el mes anterior y marque los meses que caen más de [UMBRAL]%. Mis datos vienen de [ORIGEN: lista en memoria, EF Core, CSV]. Mantené decimal para el dinero.

Exemplo escrito e revisado à mão.

Compartilhar

Comentários

Ainda não há comentários. O primeiro pode ser o seu.

Apenas texto, sem links. Não pedimos e-mail. Os comentários são revisados antes de serem publicados.

Adaptou para algo seu?

Me conte o que resolveu com isto, ou o que faltou.

Continue testando

Mais código

Ver todos
Darinel Ortega Online · respondo ao longo do dia
Hoje
Olá. Aqui eu não vendo nada: isto é para trocar conhecimento sobre tecnologia.
Escreva o que quiser — pode mandar texto, imagens ou documentos. As mensagens chegam ao meu console e eu respondo por lá.
Você está escrevendo fora do horário. Eu leio assim que o dia começar.

Conversa aberta para compartilhar conhecimento. As mensagens chegam ao meu console e eu respondo por lá.

Vamos marcar uma conversa

Escolha o dia e a hora que funcionem para você. Trinta minutos, sem discurso comercial.

Videochamada

Para uma videochamada, peça por aqui que eu te mando o link da sessão.