Esta es una consulta bastante habitual.
Cuando tenemos una colección de elementos podemos utilizar los métodos de extensión OrderBy y OrderByDescending para ordenarla de forma sencilla por alguna de sus propiedades pero, ¿qué sucede cuando el criterio de ordenación es múltiple?
Para el ejemplo vamos a suponer que tenemos una variable Personas que es una lista genérica de instancias de la clase Persona. La cual tiene tres propiedades: Nombre, Apellido y Edad.
Así podríamos ordenar de forma sencilla la lista Personas por la propiedad Apellido utilizando el método de extensión OrderBy.
La cosa se empieza a complicar si lo que deseamos es ordenar la lista por apellido y que, los que tengan el mismo apellido, se ordenen por edad.
Podríamos utilizar otra sobrecarga del método OrderBy que recibe como parámetro un objeto que implementa la interfaz IComparer<T> que contiene la lógica para ordenar los elementos de la lista.
En primer lugar deberemos crear el comparador para la clase Persona que implementa la interfaz IComparer<Persona> y que definirá la lógica para ordenar los elementos por apellido y edad en el método Compare:
Ahora ya podríamos utilizar la nueva sobrecarga del método OrderBy:
Demasiado trabajo para algo tan simple ¿verdad?
Por suerte disponemos de otros dos métodos de extensión que nos permiten realizar esta tarea de una forma mucho más sencilla: ThenBy y ThenByDescending.
Estos métodos de extensión se aplican a objetos que implementan la interfaz IOrderedEnumerable, como sucede con el valor devuelto por los métodos OrderBy y OrderByDescending. Los métodos añaden el criterio de ordenación indicado respetando los existentes en el objeto IOrderedEnumerable y devuelve un nuevo objeto IOrderedEnumerable.
De esta forma resulta tremendamente sencillo realizar la ordenación:
Dado que, como ya he comentado, los métodos ThenBy y ThenByDescending devuelven también objetos del tipo IOrderedEnumerable, podemos encadenar tantos métodos ThenBy y ThenByDescending como queramos.
Muy buen post Asier. Estupendo.
ResponderEliminarExcelente artículo. Me sirvió esto que no encontraba por ningún lado.
ResponderEliminarTengo enlazado un DataGridView y al pulsar cabecaras ,( DataGridView.Columns(e.ColumnIndex)), ordeno como explicas en los ejemplos:
ResponderEliminarSelect DataGridView.Columns(e.ColumnIndex).name
case "Codigo"
DataGridView.DataSource = ColDatosDeOperarios.OrderBy(Function(x) x.Codigo).ToList
case "Nombre"
DataGridView.DataSource = ColDatosDeOperarios.OrderBy(Function(x) x.Nombre).ToList
etc..
End Select
como puedo hacerlo directamente, (sin la select), sustituyendo x.Codigo, x.Nombre
Gracias y un saludo.
gracias
ResponderEliminarExcelente!!
ResponderEliminar