Jul 30
Ordenar una lista con expresiones Lambda (múltiples criterios) VB.Net
Este post se trata de como ordenar una lista de objetos de acuerdo a varios criterios utilizando una sola expresión lambda. El ejemplo está hecho utilizando el .net framework 3.5 (Visual Studio 2008).
Tenemos una lista de objetos con la siguiente estructura:
Public Class Elemento Public Sub New(ByVal mNum As Integer, ByVal mPrioridad As Prioridades, ByVal mValor As Integer) Numero = mNum Prioridad = mPrioridad Valor = mValor End Sub Public Enum Prioridades Alta = 0 Media = 1 Baja = 2 End Enum Public Numero As Integer Public Prioridad As Priorities Public Valor As Integer End Class
Para este ejemplo utilizaremos un objeto List(Of Elemento) que llenaremos con valores aleatorios y necesitaremos ordenarla de acuerdo a los siguientes criterios:
- Primero: Numero en orden ascendente
- Segundo: Prioridad de mayor a menor
- Tercero: Valor en orden ascendente
Supongamos que nuestra lista se completó con los siguientes elementos:
| Num | Prioridad | Valor |
| 4 | Baja | 16 |
| 1 | Alta | 26 |
| 3 | Media | 87 |
| 4 | Media | 10 |
| 2 | Baja | 3 |
| 5 | Alta | 4 |
| 4 | Media | 134 |
| 2 | Baja | 342 |
Nuestro resultado debe ser el siguiente:
| Num | Prioridad | Valor |
| 1 | Alta | 26 |
| 2 | Baja | 3 |
| 2 | Baja | 342 |
| 3 | Media | 87 |
| 4 | Media | 10 |
| 4 | Media | 134 |
| 4 | Baja | 16 |
| 5 | Alta | 4 |
Por lo tanto nuestra expresión lambda será la siguiente:
Public Sub LambdaSort(ByVal lista As List(Of Element)) lista.Sort(Function(x, y) _ x.Numero.CompareTo(y.Numero) Or _ (x.Numero.Equals(y.Numero) And x.Prioridad.CompareTo(y.Prioridad)) Or _ (x.Numero.Equals(y.Numero) And x.Prioridad.Equals(y.Prioridad) And x.Valor.CompareTo(y.Valor))) End Sub
La expresión está hecha en una sola línea que fue separada para comodidad en la lectura, por lo que iremos viendo linea a linea, en la primera declaramos la expresión lambda que va a ordenar la lista:
lista.sort(Function(x,y)
luego vamos ennumerando nuestras condiciones:
x.Numero.CompareTo(y.Numero) Comparamos el valor de x.Numero con el de y.Numero, esta comparación nos devuelve el orden ascendente o sea x < y.
(x.Numero.Equals(y.Numero) And x.Prioridad.CompareTo(y.Prioridad)) Si x.Numero = y.Numero comparamos la Prioridad de ambos al igual que lo hicimos en el punto anterior con Numero.
(x.Numero.Equals(y.Numero) And x.Prioridad.Equals(y.Prioridad) And x.Valor.CompareTo(y.Valor)) Si x.Numero = y.Numero y también x.Priridad = y.Pririodad comparamos el Valor.
Separamos cada uno de los criterios de ordenación con OR para que se aplique uno u otro y listo.
Sin duda una forma simple y rápida de ordenar una lista.
