Volver al 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.

El 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 qué está escrito así

  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.
Cómo probarlo

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

Ojo con esto

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.

Adaptalo a tu caso con IA

El botón copia este prompt con el código pegado debajo. Reemplazá los corchetes con lo tuyo y pegalo en ChatGPT, Claude, Gemini o Copilot.

El 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.

Ejemplo escrito y revisado a mano.

Compartir

Comentarios

Todavía no hay comentarios. El primero puede ser el tuyo.

Solo texto, sin enlaces. No se pide correo. Los comentarios se revisan antes de publicarse.

¿Lo adaptaste a algo tuyo?

Contame qué resolviste con esto, o qué le faltó.

Seguí probando

Más código

Ver todos
Darinel Ortega En línea · respondo durante el día
Hoy
Hola. Acá no vendo nada: esto es para intercambiar conocimiento sobre tecnología.
Escribime lo que quieras — podés mandar texto, imágenes o documentos. Los mensajes llegan a mi consola y te respondo desde ahí.
Estás escribiendo fuera de horario. Te leo apenas empiece el día.

Conversación abierta para compartir conocimiento. Los mensajes llegan a mi consola y respondo desde ahí.

Agendemos una conversación

Elegí el día y la hora que te sirvan. Son treinta minutos, sin agenda comercial.

Videollamada

Para una videollamada, pedila por acá y te paso el enlace de la sesión.