Saltar al contenido

Ordenar una lista genérica en C#

by en 23 May, 2011

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

From → C#, Linq

11 comentarios
  1. Mario permalink

    esta las huevas

  2. Reblogged this on Nathan.

  3. fusche permalink

    y si las id son diferentes?? como puedo ordenarlos por id?? de echo tengo qe ordenarlos por nro legajo

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

  5. fusche permalink

    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

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

  7. sebastian permalink

    Genio! me sirvio mucho!
    gracias por el aporte! saludos!

  8. macu permalink

    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.

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

Trackbacks & Pingbacks

  1. Consultas en c# usando Linq « Tips del Gabo! :)

Deja un comentario