Cómo ordenar List<T> por propiedad de objeto en C#: guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Ordenación de List<T> en C#: del caos al orden en 5 minutos

\n\n

Imagine: tiene una lista de usuarios y necesita mostrarlos en pantalla en orden alfabético por apellido. O una lista de productos: ordenarlos por precio de menor a mayor. ¿Le suena familiar? En Stack Overflow, la pregunta «How to Sort a List<T> by a property in the object» ha acumulado miles de visitas, lo que significa que este tema preocupa a muchos desarrolladores.

\n\n

En este artículo, analizaremos cinco formas de ordenar una lista en C#. Aprenderá a ordenar por una propiedad, por varios campos y también cómo hacer que la ordenación sea lo más rápida posible. ¡Comencemos!

\n\n

Qué vamos a ordenar: la clase User

\n\n

Para los ejemplos, tomaremos un modelo de datos simple: un usuario con nombre, edad y calificación.

\n\n
public class User\n{\n    public string Name { get; set; }\n    public int Age { get; set; }\n    public double Rating { get; set; }\n\n    public override string ToString()\n    {\n        return $"{Name} ({Age}) — {Rating:F2}";\n    }\n}
\n\n

Creemos una lista de prueba:

\n\n
List<User> users = new List<User>\n{\n    new User { Name = "Анна", Age = 30, Rating = 4.5 },\n    new User { Name = "Борис", Age = 25, Rating = 3.8 },\n    new User { Name = "Виктор", Age = 35, Rating = 4.9 },\n    new User { Name = "Галина", Age = 28, Rating = 4.2 }\n};
\n\n

Forma 1: LINQ OrderBy: la más simple y elegante

\n\n

Si desea ordenar List<T> por una propiedad de objeto de forma rápida y sin código adicional, use LINQ. El método OrderBy crea una nueva secuencia ordenada sin modificar la lista original. Es ideal cuando necesita una ordenación «sobre la marcha».

\n\n
// Ordenación por nombre (ascendente)\nvar sortedByName = users.OrderBy(u => u.Name).ToList();\n\n// Ordenación por edad (descendente)\nvar sortedByAgeDesc = users.OrderByDescending(u => u.Age).ToList();\n\n// Ordenación por varios campos: primero por edad, luego por calificación\nvar sortedMulti = users\n    .OrderBy(u => u.Age)\n    .ThenBy(u => u.Rating)\n    .ToList();
\n\n

Ventajas: legibilidad, cadenas de ordenación, funciona con cualquier tipo de propiedad.
\nDesventajas: crea una nueva lista (memoria adicional).

\n\n

Forma 2: List.Sort con delegado Comparison: ordenación in situ

\n\n

Si necesita ordenar una lista en C# sin crear una copia (ahorro de memoria), use el método Sort con una expresión lambda. Esta forma modifica la colección original.

\n\n
// Ordenación por nombre (in situ)\nusers.Sort((a, b) => string.Compare(a.Name, b.Name, StringComparison.Ordinal));\n\n// Ordenación por edad (descendente)\nusers.Sort((a, b) => b.Age.CompareTo(a.Age));\n\n// Ordenación por calificación\nusers.Sort((a, b) => a.Rating.CompareTo(b.Rating));
\n\n

Ventajas: no crea un nuevo objeto, más rápido para listas grandes.
\nDesventajas: menos legible en ordenaciones complejas.

\n\n

Forma 3: Implementación de IComparable: ordenación «lista para usar»

\n\n

Si su clase siempre debe ordenarse por el mismo campo (por ejemplo, por nombre), implemente la interfaz IComparable<T>. Entonces, List.Sort() funcionará sin argumentos.

\n\n
public class User : IComparable<User>\n{\n    // ... propiedades del ejemplo anterior ...\n\n    public int CompareTo(User other)\n    {\n        if (other == null) return 1;\n        return string.Compare(this.Name, other.Name, StringComparison.Ordinal);\n    }\n}\n\n// Uso\nusers.Sort(); // automáticamente por nombre
\n\n

Ventajas: ordenación natural para la lógica de negocio.
\nDesventajas: define una regla fija: para otros campos, deberá escribir lógica separada.

\n\n

Forma 4: IComparer: ordenación flexible

Blogs

Book Recommendations