Ordenar una lista genérica en C#
Las listas genéricas proveen una serie de métodos basados en Linq y variables lambda. Si les soy honesto aún no domino esto de las variables lambda y del Linq, pero si les puedo decir que se ve muy prometedor.
Para ordenar una lista genérica, se pueden utilizar dos métodos .Sort() o .OrderBy(), Sort actúa sobre la misma lista, mientras que OrderBy retorna un objeto nuevo. Su uso a continuación:
Supongamos un objeto muy simple:
public class Persona { public int ID { get; set; } public string Nombre { get; set; } public string Apellido { get; set; } public DateTime FechaNacimiento { get; set; } public Persona(int ID, string Nombre, string Apellido, DateTime FechaNacimiento) { this.ID = ID; this.Nombre = Nombre; this.Apellido = Apellido; this.FechaNacimiento = FechaNacimiento; } }
Ahora supongamos que tenemos un listado de personas desordenadas y tenemos que ordenarlas:
List<Persona> lista = new List<Persona>(); lista.Add(new Persona(1, "Gabriel", "Espinoza", new DateTime(1986, 6, 19))); lista.Add(new Persona(2, "Carolina", "Alarcón", new DateTime(1984, 10, 27))); lista.Add(new Persona(3, "Jorge", "Ibacache", new DateTime(1983, 2, 9))); lista.Add(new Persona(4, "Luis", "Bauerle", new DateTime(1986, 4, 1))); lista.Add(new Persona(5, "Rafael", "Dávila", new DateTime(1982, 6, 24))); lista.Add(new Persona(6, "Daniel", "Martinez", new DateTime(1981, 12, 2))); lista.Sort((p, q) => string.Compare(p.Nombre, q.Nombre)); //Ordena alfabéticamente por nombre la lista genérica lista lista.Sort((p, q) => DateTime.Compare(p.FechaNacimiento, q.FechaNacimiento)); //Ordena según la edad 🙂 (los más jóvenes primero) lista = lista.OrderBy(p => p.Nombre).ToList(); //Retorna una lista ordenara por Nombre lista = lista.OrderBy(p => p.Nombre).OrderBy(p => p.Apellido).ToList(); //Ordena la lista por Nombre y luego por apellido lista = lista.OrderByDescending(p => p.Nombre).ToList(); //Ordena descendientemente por nombre
Así de fácil, así de bonito.
Enjoy 🙂
Fuente: http://stackoverflow.com/questions/188141/c-list-orderby-alphabetical-order
¿Quieres aprender más del tema? http://www.codedigest.com/Articles/CSHARP/84_Sorting_in_Generic_List.aspx
esta las huevas
Reblogged this on Nathan.
y si las id son diferentes?? como puedo ordenarlos por id?? de echo tengo qe ordenarlos por nro legajo
También funciona impecable. Si me envías la clase o estructura que estás ordenando y el campo que necesitas ordenar, yo te puedo enviar el código para ordenarlo.
El código que yo puse tiene un pequeño error: Los ID son todos iguales, deberían ser 1, 2, 3…y así. Lo corregiré.
EDIT: Corregí el error en el código y aproveché de ponerle «estilo» de código fuente.
Gracias por responder, te explico, yo tengo una clase con nombre, apellido, y nro legajo. Lo que integra la lista es agregado por el usuario, en mi ejemplo, alguien qe administra un colegio tiene qe hacer una lista de alumnos y tiene qe estar ordenada por nro legajo; entendes?? gracias
puedes intentar algo así:
si tu clase estaá definida así:
public class Alumno
{
public string Nombre{ get; set; }
public string Apellido{ get; set; }
public int NroLegajo{ get; set; }
}
y necesitas ordenar por alguna propiedad, puedes hacer lo siguiente
miLista = miLista.OrderBy(x => x.PROPIEDAD).ToList();
entonces si necesitas ordenar por Nombre:
miLista = miLista.OrderBy(x => x.Nombre).ToList();
si necesitas ordenar por Apellido:
miLista = miLista.OrderBy(x => x.Apellido).ToList();
si necesitas ordenar por NroLegajo:
miLista = miLista.OrderBy(x => x.NroLegajo).ToList();
Espero aclare tus dudas.
Genio! me sirvio mucho!
gracias por el aporte! saludos!
No funciona si quieres ordenar con dos parámetros, para que funciones hay que hacer esto:
lista.OrderBy(x => x.NombreTipo).ThenBy(x=>x.FechIni).ToList();
ThenBy() ordena posteriormente al la secuencia que genera el OrderBy() inicial.
Hola he estado buscando algo parecido pero los datos estan en un archivo txt los cuales carga en un listbox, porias subir tu clase para analizarla?
Hola Marcos. ¿a qué te refieres con subir mi clase? Todo lo que necesitas está ahí.
Si quieres, te puedo ayudar a analizar tu problema, agrégame a skype: gab.espinoza
Saludos