2012-07-18 9 views
6

Estoy tratando de ordenar los datos de un tipo T en un contenedor por dos de las propiedades de T. Es potencialmente una gran cantidad de datos, por lo que preferiría que la clasificación ocurriera en la inserción. He examinado tanto List como SortedList, pero ambos no proporcionan la funcionalidad que necesito.Ordenando la inserción con una función de comparación

¿C# proporciona un contenedor que permite tanto ordenar en la inserción como ordenar una función de comparación? Me gustaría evitar la ordenación posterior a la inserción como List.Sort, y evitar la sobrecarga de utilizar los datos como clave y valor para SortedList.

+1

Hay una interfaz 'IComparer' que puede ayudar con las funciones de clasificación. Cada elemento podría usar su objeto comparador personalizado para ordenar por cualquier combinación de propiedades del elemento. Puede ser necesario implementar 'IList ' para un contenedor de clasificación personalizado. – IAbstract

+0

Esto parece ser un problema más algorítmico que uno de estructura de datos. ¿Tiene un punto final definido, cuando todos los datos están insertados en su lista? ¿Necesitas datos mientras se insertan más datos? ¿Necesita múltiples valores idénticos en esta lista? ¿Cómo se llama "gran cantidad de datos"? –

+0

Eche un vistazo a esta publicación ... probablemente responderá a su pregunta: http://devlicio.us/blogs/marcin_hoppe/archive/2007/05/15/how-to-keep-list-t-sorted. aspx –

Respuesta

6

Si está utilizando .NET 4, puede usar SortedSet con un IComparer<T> personalizado. La desventaja es que no le permitirá tener múltiples elementos iguales. ¿Lo necesitas?

No está claro para mí por qué desea ordenar la inserción simplemente porque tiene muchos datos. ¿Necesita que se ordene antes de haber terminado de insertar? De lo contrario, esperaría que un solo tipo al final (a través de List.Sort) sea tan eficiente como uno sobre la marcha.

+0

¿Te oigo decir que esto suena como un problema XY, @JonSkeet? –

+0

Bueno, tipo de. No llegaría tan lejos, pero al menos merece una mayor consideración. –

2

Si desea mantener el mismo orden de clasificación todo el tiempo, puede usar SortedList<K,V> o SortedDictionary<K,V> y pasar un IComparer<K> al constructor.

Si necesita diferentes órdenes de clasificación en el mismo contenedor, puede usar un List<T> y pasar un IComparer<T> al método Sort.

Dado que probablemente esté almacenando tipos de referencia, no me preocuparía demasiado usar los elementos como clave así como los valores. Usted solo está almacenando las referencias.

Otra opción sería implementar su propia estructura de árbol binario.

+0

Con la información dada, su respuesta debería resolver el problema. –

Cuestiones relacionadas