Similar a List <> OrderBy Alphabetical Order , queremos ordenar por un elemento y luego por otro. queremos lograr el equivalente funcional de
SELECT * from Table ORDER BY x, y
Tenemos una clase que contiene una serie de funciones de clasificación y no tenemos problemas para clasificar por un elemento.
Por ejemplo:
public class MyClass {
public int x;
public int y;
}
List<MyClass> MyList;
public void SortList() {
MyList.Sort( MySortingFunction );
}
Y tenemos lo siguiente en la lista:
Unsorted Sorted(x) Desired
--------- --------- ---------
ID x y ID x y ID x y
[0] 0 1 [2] 0 2 [0] 0 1
[1] 1 1 [0] 0 1 [2] 0 2
[2] 0 2 [1] 1 1 [1] 1 1
[3] 1 2 [3] 1 2 [3] 1 2
Sería preferible un tipo estable, pero no obligatorio. La solución que funcione para .Net 2.0 es bienvenida.
Respuestas:
Tenga en cuenta que no necesita un tipo estable si compara todos los miembros. La solución 2.0, según lo solicitado, puede tener este aspecto:
Tenga en cuenta que esta solución 2.0 sigue siendo preferible a la popular solución 3.5 Linq, realiza una clasificación en el lugar y no tiene el requisito de almacenamiento O (n) del enfoque Linq. A menos que prefiera que el objeto List original esté intacto, por supuesto.
fuente
Para las versiones de .Net donde puede usar LINQ
OrderBy
yThenBy
(oThenByDescending
si es necesario):Nota: para .Net 2.0 (o si no puede usar LINQ) vea la respuesta de Hans Passant a esta pregunta.
fuente
Necesita implementar la interfaz IComparer . Aquí hay una buena publicación con código de ejemplo.
fuente
El truco consiste en implementar un tipo estable. Creé una clase de widget que puede contener sus datos de prueba:
Implementé IComparable, por lo que List.Sort () puede ordenarlo de manera inestable.
Sin embargo, también implementé el método estático Compare, que se puede pasar como delegado a un método de búsqueda.
Tomé prestado este método de ordenación por inserción de C # 411 :
Pondría esto en la clase de ayudantes de ordenación que mencionó en su pregunta.
Ahora, para usarlo:
Y da como resultado:
Esto probablemente se podría arreglar con algunos delegados anónimos, pero eso se lo dejo a usted.
EDITAR : Y NoBugz demuestra el poder de los métodos anónimos ... así que, considere el mío más antiguo: P
fuente
Esto puede ayudarlo, Cómo ordenar la lista genérica de C #
fuente
Tuve un problema en el que OrderBy y ThenBy no me dieron el resultado deseado (o simplemente no sabía cómo usarlos correctamente).
Fui con una lista. Clasifique la solución algo como esto.
fuente