0Pricing
C# Academy · Lección

Agregados y ToList

Cuente, sume y materialice los resultados

Agregados y ToList es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.

Contar elementos

Count devuelve el número de elementos de una secuencia. Con un predicado, cuenta únicamente los elementos que coinciden.

Obliga a enumerar la secuencia, por lo que se recorre completa para obtener el total: es una operación de agregación.

using System;
using System.Linq;

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

Sumar valores

Sum suma valores numéricos. En una secuencia numérica, suma sus elementos; con un selector, suma el valor proyectado de cada elemento.

Devuelve el mismo tipo numérico que el origen o que el resultado del selector.

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);

Calcular promedios

Average calcula la media aritmética. Al igual que Sum, acepta un selector opcional.

El resultado es de tipo de coma flotante, por ejemplo double, incluso cuando el origen contiene enteros, por lo que no se pierde precisión en la división.

using System;
using System.Linq;

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

Min y Max

Min y Max devuelven los valores menor y mayor. Con un selector, reducen una clave proyectada.

En las versiones modernas de .NET, MaxBy y MinBy devuelven el elemento completo con la clave extrema, no solo el valor de la clave.

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 con las secuencias vacías

En una secuencia vacía, Average, Min y Max lanzan InvalidOperationException cuando se aplican a tipos de valor. Sum devuelve cero y Count devuelve cero.

Puede comprobarlo con Any() o usar DefaultIfEmpty antes de calcular el promedio de datos que podrían estar vacíos.

using System;
using System.Linq;

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

Aggregate para acumulaciones personalizadas

Aggregate reduce una secuencia a un único valor mediante una función acumuladora. Es la forma general en la que se basan Sum y otras operaciones.

Puede proporcionar un valor inicial y combinar cada elemento con el resultado acumulado, lo que resulta útil para productos, concatenaciones o 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);

Materializar con ToList

ToList ejecuta la consulta inmediatamente y copia los resultados en una List<T>. De este modo, se interrumpe deliberadamente la ejecución diferida.

Úselo para tomar una instantánea estable, evitar volver a ejecutar una secuencia costosa u obtener funcionalidades de las listas, como la indexación y la propiedad 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 y ToDictionary

Entre los materializadores relacionados se incluyen ToArray, que crea una matriz de tamaño fijo, y ToDictionary, que permite realizar búsquedas por clave.

ToDictionary recibe un selector de clave y, opcionalmente, un selector de valor; lanza una excepción si dos elementos generan la misma clave.

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 qué materializar

Las consultas diferidas se vuelven a ejecutar cada vez que se recorren. Si una secuencia es costosa o lee un origen que cambia, repetirla puede provocar errores y lentitud.

Llamar una vez a ToList captura los resultados, de modo que las lecturas posteriores son rápidas y coherentes.

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, Single y Any

Los operadores de elementos también fuerzan la ejecución. First devuelve la primera coincidencia y lanza una excepción si no existe; FirstOrDefault devuelve el valor predeterminado en su lugar; y Single exige que haya exactamente una.

Any indica si una secuencia contiene algún elemento coincidente sin tener que contarlos todos.

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}");

Secuencia completa

Las consultas reales encadenan filtrado, proyección, ordenación y agregación, y a menudo terminan con un materializador.

Léala de arriba abajo: filtre, dé forma a los datos, ordénelos y, por último, recopílelos. El ToList final ejecuta toda la secuencia una sola 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));

Comprobación rápida

Razone sobre la ejecución diferida y la materialización.

Resumen

Las agregaciones reducen una secuencia a un valor: Count, Sum, Average, Min/Max, MinBy/MaxBy y el Aggregate general. Fuerzan la ejecución y pueden lanzar excepciones con orígenes vacíos.

ToList, ToArray y ToDictionary materializan los resultados, interrumpiendo la ejecución diferida para que una secuencia costosa se ejecute una sola vez. Con esto se completa el conjunto de herramientas de LINQ para filtrar y proyectar.

Preguntas frecuentes

¿La lección «Agregados y ToList» es gratis?

Sí — el texto completo de «Agregados y ToList» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Agregados y ToList»?

Cuente, sume y materialice los resultados Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C# Academy?

No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Agregados y ToList»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C# Academy?

Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Where y filtrado
  2. Select y proyección
  3. OrderBy y agrupación
  4. Agregados y ToList
← Volver a C# Academy