Hubo una pregunta acerca de cómo ordenar una lista. Hubo varios métodos dados desde Basic List.Sort() a List.OrderBy(). Lo más risible fue un Roll-your-own-SelectionSort. Inmediatamente voté eso, pero me hizo pensar; ¿no aplicaría OrderBy() de Linq a una lista, haría lo mismo? myList.OrderBy (x => x.Property) .ToList() produciría un iterador que básicamente encuentra el valor mínimo de la proyección en lo que queda de la colección y yield la devuelve. Cuando revisamos toda la lista, es un tipo de selección.Rendimiento de los clasificadores de colecciones .NET integrados
Lo que me hizo pensar; ¿Qué algoritmos usan los clasificadores incorporados para listas, listas ordenadas, enumeraciones, etc. y, por extensión, se debe evitar alguno de ellos para colecciones grandes? Una SortedList, ya que permanece ordenada por clave, probablemente usaría un InsertionSort de un solo paso en cada adición; encuentre el primer índice con un valor mayor que el nuevo e inserte antes. Las listas y matrices probablemente se fusionen de manera bastante eficiente, pero no conozco el algoritmo real detrás de Sort(). Hemos discutido OrderBy.
Lo que sé arriba parece indicar que List.Sort() o Array.Sort() son las mejores opciones para una lista de tamaño conocido, y se debe desalentar el uso de Linq para ordenar una lista o matriz en memoria . Para una transmisión, realmente no hay otra manera que OrderBy() enumerable; la pérdida de rendimiento se ve mitigada por el hecho de que puede mantener los datos como una secuencia en lugar de tener que tenerlos todos antes de ordenarlos.
EDIT:
El consenso general es que Sort() se da más rápido de una aplicación concreta de una lista o matriz. OrderBy es razonable pero más lento porque agrega O (N) complejidad de extraer una matriz del enumerable pasado. La inicialización de SortedList termina siendo O (N^2) debido a lo que está debajo del capó. Moraleja de la historia, use List.Sort() en lugar de List.OrderBy() cuando tenga una Lista real.
Creo que la mayoría de los sortes incorporados usan la ordenación rápida. Si desea acelerarlo, elimine la verificación de límites. List.Sort también usa Array.Sort internamente. –
@Mikael es correcto, OrderBy() utiliza la ordenación rápida también. @KeithS, usted puede navegar felizmente por el código fuente, está disponible públicamente (e integrado en VS). EnumerableSorter.QuickSort es el nombre del método que utiliza OrderBy. –
.Net Reflector para el rescate otra vez - ¡tengo que amarlo! –