2010-07-31 12 views
13

Me gustaría saber qué es mejor usar.LINQ orderby vs IComparer

clase de IComparer y método de comparación para ordenar o LINQ ordenar por Lista. Ambas funcionan bien, pero cuál es mejor para listas grandes.

Respuesta

9

Elegiría LINQ por dos razones.

  • Las consultas de LINQ son generalmente más cortas y fáciles de leer.
  • Si realmente tiene una gran cantidad de elementos, Linq también le brinda la capacidad de scale out to multiple CPU cores al usar PLinq, lo que podría ayudarlo significativamente.

Yo esperaría que el rendimiento sea más o menos similar a una aplicación de un solo subproceso, si se tiene en cuenta que la expresión lambda en su cláusula OrdenarPor compila a una función - que es prácticamente todo lo que obtiene mediante la aplicación de IComparer de todos modos.

Dicho esto, puede obtener un aumento en el rendimiento cambiando el algoritmo de ordenamiento para que se adapte a la forma en que sus datos ya están ordenados, en lugar de cambiar el método de comparación. Pero estaría dispuesto a apostar mi café esta mañana que OrderBy en sus declaraciones de Linq utiliza una implementación de Quicksort, por lo que probablemente ya sea bastante decente en el caso general.

4

Prefiero usar LINQ por defecto para todas las operaciones basadas en colecciones. La ventaja aquí es que no tengo que asumir demasiado sobre el tipo de la colección utilizada (OrderBy funciona en IEnumerable).

Si tiene un IList<T> de todos modos, entonces List.Sort probablemente sea más rápido.

De todos modos, no me preocupo por ello antes de que haya una probada (es decir, medido) el rendimiento problema

2

Creo semánticamente los dos son muy diferentes, la interfaz IComparer le permite definir el tipo está ordenada de forma natural, OrdenarPor le da una forma de ordenar sus objetos mediante una tecla específica, por ejemplo dada una lista de objetos Persona, para la consulta A ordenar la lista por Nombre, para la consulta B ordenar la lista por Edad.

LINQ le da más flexibilidad, pero como OrderBy requiere un Func que toma su tipo de objeto y devuelve una clave para usar para la clasificación, cualquier clave que devuelva necesitará implementar la interfaz IComparer.

En términos de rendimiento en una lista grande, dependiendo de lo que esté haciendo en el método Compare, es probable que haya muy poca diferencia entre los dos enfoques que imaginaría, aunque lo mejor es probarlo con su tipo .

+0

thx all for answers. – senzacionale

Cuestiones relacionadas