OrderBy y agrupación
Ordene y agrupe los resultados
OrderBy y agrupación es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 3 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.
Ordenación con OrderBy
OrderBy ordena una secuencia de forma ascendente según una clave que usted selecciona. La lambda devuelve el valor por el que se ordenará.
Devuelve una secuencia nueva y ordenada, y es estable, lo que significa que los elementos con la misma clave conservan su orden relativo original.
using System;
using System.Linq;
int[] nums = { 4, 1, 3, 2 };
var sorted = nums.OrderBy(n => n);
Console.WriteLine(string.Join(", ", sorted));Orden descendente
OrderByDescending ordena de mayor a menor según la clave seleccionada.
Úselo directamente en lugar de ordenar de forma ascendente y después invertir el resultado: expresa la intención con claridad y ordena en una sola pasada.
using System;
using System.Linq;
int[] scores = { 70, 95, 60, 88 };
var ranked = scores.OrderByDescending(s => s);
Console.WriteLine(string.Join(", ", ranked));Ordenación por una propiedad
Para los objetos, seleccione la propiedad por la que desea ordenar. OrderBy(p => p.Age) ordena a las personas de menor a mayor edad.
La clave puede ser cualquier tipo comparable —números, cadenas o fechas— o cualquier tipo que implemente IComparable.
using System;
using System.Linq;
using System.Collections.Generic;
record P(string Name, int Age);
var people = new List<P> { new("Ana", 30), new("Bo", 22) };
var byAge = people.OrderBy(p => p.Age);
foreach (var p in byAge) Console.WriteLine(p.Name);Ordenación secundaria con ThenBy
ThenBy añade un criterio de desempate. Después de OrderBy, ordena los elementos que comparten la clave principal según una segunda clave.
Puede encadenar varias llamadas a ThenBy/ThenByDescending para establecer un orden de varios niveles.
using System;
using System.Linq;
using System.Collections.Generic;
record P(string Name, int Age);
var people = new List<P> { new("Bo", 30), new("Ana", 30), new("Cy", 22) };
var ordered = people.OrderBy(p => p.Age).ThenBy(p => p.Name);
foreach (var p in ordered) Console.WriteLine($"{p.Age} {p.Name}");Por qué no debe usar un segundo OrderBy
Llamar a OrderBy dos veces no proporciona un criterio de desempate: la segunda llamada vuelve a ordenar todo y descarta el orden anterior.
Para aplicar una ordenación por niveles, use siempre ThenBy después del OrderBy inicial.
using System;
using System.Linq;
using System.Collections.Generic;
record P(string N, int A);
var ps = new List<P> { new("Bo", 30), new("Ana", 30) };
var wrong = ps.OrderBy(p => p.A).OrderBy(p => p.N);
foreach (var p in wrong) Console.WriteLine(p.N);Cláusula orderby en la sintaxis de consulta
La sintaxis de consulta tiene una cláusula orderby. Enumere varias claves separadas por comas, opcionalmente con descending.
orderby p.Age, p.Name descending ordena primero por edad y, en caso de empate, por nombre en orden inverso.
using System;
using System.Linq;
using System.Collections.Generic;
record P(string N, int A);
var ps = new List<P> { new("Bo", 30), new("Ana", 30), new("Cy", 22) };
var q = from p in ps orderby p.A, p.N select p.N;
Console.WriteLine(string.Join(", ", q));Agrupación con GroupBy
GroupBy divide una secuencia en grupos que comparten una clave. Devuelve una secuencia de IGrouping<TKey, TElement>.
Cada agrupación expone su Key y también se puede recorrer para obtener los elementos de ese grupo.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4, 5, 6 };
var groups = nums.GroupBy(n => n % 2 == 0 ? "even" : "odd");
foreach (var g in groups)
Console.WriteLine($"{g.Key}: {string.Join(\",\", g)}");Clave y miembros del grupo
La Key de cada grupo identifica la partición, y recorrer el grupo devuelve sus miembros. Puede llamar directamente a Count() sobre un grupo.
Así puede crear histogramas, recuentos y desgloses por categorías.
using System;
using System.Linq;
string[] fruit = { "apple", "avocado", "banana", "cherry" };
var byLetter = fruit.GroupBy(f => f[0]);
foreach (var g in byLetter)
Console.WriteLine($"{g.Key}: {g.Count()}");Agrupar y después proyectar
Un patrón habitual consiste en proyectar cada grupo en un objeto de resumen mediante Select después de GroupBy.
Se lee la Key y se agregan los miembros, por ejemplo, para obtener un recuento o una suma por grupo.
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", 2) };
var totals = sales.GroupBy(s => s.City)
.Select(g => new { g.Key, Sum = g.Sum(x => x.Amt) });
foreach (var t in totals) Console.WriteLine($"{t.Key}={t.Sum}");GroupBy con selector de elementos
GroupBy tiene una sobrecarga que recibe una segunda lambda, llamada selector de elementos, que proyecta lo que almacena cada grupo, no solo la forma en que se define su clave.
Aquí se agrupa por ciudad, pero solo se almacenan los importes.
using System;
using System.Linq;
using System.Collections.Generic;
record Sale(string City, int Amt);
var sales = new List<Sale> { new("NY", 5), new("NY", 2) };
var g = sales.GroupBy(s => s.City, s => s.Amt);
foreach (var grp in g)
Console.WriteLine($"{grp.Key}: {string.Join(\",\", grp)}");La ordenación y la agrupación son diferidas
Tanto OrderBy como GroupBy utilizan ejecución diferida: se ejecutan cuando se enumeran. Sin embargo, tenga en cuenta que la ordenación y la agrupación deben consumir todo el origen para producir el primer elemento.
Por tanto, a diferencia de Where, no funcionan como un flujo continuo: el coste se asume en la primera iteración.
using System;
using System.Linq;
int[] nums = { 3, 1, 2 };
var q = nums.OrderBy(n => n);
Console.WriteLine("Query built");
Console.WriteLine(string.Join(", ", q));Comprobación rápida
Piense en la ordenación de varios niveles.
Resumen
OrderBy/OrderByDescending ordenan según una clave; ThenBy añade criterios de desempate. Un segundo OrderBy vuelve a ordenar todo y no sirve como criterio de desempate.
GroupBy divide los datos en objetos IGrouping con una Key y miembros, que a menudo se proyectan en resúmenes. Ambas operaciones son diferidas, pero consumen todo el origen. A continuación, agregaremos y materializaremos los resultados.
Preguntas frecuentes
¿La lección «OrderBy y agrupación» es gratis?
Sí — el texto completo de «OrderBy y agrupación» 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 «OrderBy y agrupación»?
Ordene y agrupe 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 3 de 4.
¿Cuánto tiempo toma la lección «OrderBy y agrupación»?
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
- Where y filtrado
- Select y proyección
- OrderBy y agrupación
- Agregados y ToList