2011-02-02 12 views
18

Digamos que tengo una lista de canciones.¿Cómo puedo ordenar una lista <T> por múltiples T.attributes?

Song { 
    public string Name = ""; 
    public int PlayOrder = 0; 
    } 

Ahora quiero que los clasifique por primera vez por Orden de Reproducción a partir de cero y en segundo lugar por nombre alfabéticamente.

lo tanto, un sistema de ejemplo de resultados ordenados habría (Nombre, Orden de Reproducción):

/* 
    Pachelbel's Canon, 0 
    A Happy Song, 4 
    Beethoven's 5th, 4 
    Some Other Song, 7 
*/ 

ver cómo el playorder = 4 unidades están en orden alfabético? Eso es lo que estoy buscando.

Ahora mismo tengo que sólo se puede clasificar por un campo:

List<Song> final = new List<Song>(); 

... 

final.Sort((x, y) => x.PlayOrder.CompareTo(y.PlayOrder)); 

return final; 

¿Cómo se puede también ordenar por Nombre como se ha demostrado anteriormente?

Respuesta

35
return final.OrderBy(s => s.PlayOrder).ThenBy(s => s.Name); 
+0

Tenga en cuenta que esto devuelve una nueva secuencia 'IEnumerable ' en lugar de ordenar la lista original en contexto. – LukeH

+0

Si quisiera que devolviera una lista, ¿podría agregar un .ToList() al final? – BigOmega

+1

sí, es correcto –

21

Si desea seguir utilizando el método de clasificación que tendrá que hacer su función de comparación más inteligente:

final.Sort((x, y) => { 
    var ret = x.PlayOrder.CompareTo(y.PlayOrder); 
    if (ret == 0) ret = x.Name.CompareTo(y.Name); 
    return ret; 
}); 

Si desea utilizar LINQ a continuación, se puede ir con lo que K Ivanov publicada.

+3

Nota: Sort() "realiza un tipo inestable "while OrderBy" realiza un tipo estable, es decir, si las claves de dos elementos son iguales, se conserva el orden de los elementos " –

+0

¿Cómo funciona esto? ¿Qué está pasando entre las llaves y cómo puedo devolver una var? ¿A qué está volviendo? ¿El código dentro de las llaves se ejecutará una o más veces? – BigOmega

+0

El código en las llaves es el cuerpo de la expresión lambda, que es el mismo que la expresión lambda que utiliza en la pregunta. El problema es que para hacer esto necesitaba más de una declaración, así que tuve que poner llaves alrededor del cuerpo. Básicamente, el código es el código de comparación y el algoritmo de ordenación lo llamará muchas veces (del orden de: nlogn). – tster

Cuestiones relacionadas