Me he encontrado corriendo a través de un código anterior de 3.5 framework heredado, y encontré algunos puntos donde hay un todo montón de listas y diccionarios que deben actualizarse de manera sincronizada. He determinado que puedo hacer que este proceso sea infinitamente más fácil de utilizar y comprender si los converges en clases de contenedores personalizados de nuevas clases personalizadas. Sin embargo, hay algunos puntos en los que surgió la preocupación de organizar el contenido de estas nuevas clases de contenedores por una propiedad interior específica. Por ejemplo, clasificando por la propiedad de número ID de una clase.Utilidad de la lista <T> .Sort() frente a la lista <T> .OrderBy() para un miembro de una clase de contenedor personalizado
Como las clases de contenedor se basan principalmente en un objeto List genérico, mi primer instinto fue escribir las clases internas con IComparable, y escribir el método CompareTo que compara las propiedades. De esta manera, solo puedo llamar al items.Sort()
cuando quiero invocar la clasificación.
Sin embargo, he estado pensando en utilizar items = items.OrderBy(Func)
en su lugar. De esta forma, es más flexible si necesito ordenar por cualquier otra propiedad. La legibilidad también es mejor, ya que la propiedad utilizada para la clasificación se enumerará en línea con la llamada de clasificación en lugar de tener que buscar el código IComparable. La implementación general se siente más limpia como resultado.
No me importa la optimización prematura o micro, pero me gusta la consistencia. Encuentro que es mejor seguir con un tipo de implementación para tantos casos como sea apropiado, y usar diferentes implementaciones donde sea necesario. ¿Vale la pena convertir mi código para usar LINQ OrderBy en lugar de usar List.Sort? ¿Es una mejor práctica seguir con la implementación de IComparable para estos contenedores personalizados? ¿Hay alguna ventaja mecánica significativa ofrecida por cualquiera de las dos vías en la que debería ponderar la decisión? ¿O su funcionalidad final es equivalente al punto en que simplemente se convierte en la preferencia del codificador?
Bueno, el volumen indicado por sus puntos de referencia habla ... volúmenes.Con tasas como esa, incluso puedo incluir 3 tipos para reemplazar ese punto. Había usado 3 OrderBys y obtuve un mejor rendimiento que si hubiera utilizado solo un OrderBy. Sort() lo es! –
Un seguimiento rápido, a juzgar por sus cálculos ... ¿esto también significa que 'items.First()' es significativamente más lento que 'items [0]'? –
No, 'First()' está optimizado para las implementaciones 'IList' y devolverá 'list [0]'. Espero que el rendimiento sea el mismo. Incluso si estaba usando directamente la enumeración, sigue siendo solo un elemento para iterar, por lo que probablemente sea una micro optimización. –