2008-10-21 6 views
5

Me hacen creer que no puedo contar con el orden de los elementos agregados a un diccionario para fines de enumeración.¿Qué elementos de la clase de colección dotnet pueden enumerarse en "orden de adición" y recuperarse mediante una clave?

¿Existe una clase (genérica si es posible) a la que se pueden agregar elementos con una clave y que se pueden enumerar por orden de adición o que se pueden recuperar por clave?

Aclaración: No quiero enumerar en el pedido clave. Quiero enumerar en orden adicional. Lo que quiere decir que quiero poder recuperar los artículos a través de la enumeración en una base FIFO (primero en entrar, primero en salir).

Respuesta

3

En primer lugar, en su hipótesis principal, está en lo cierto. Un diccionario normal no garantiza el orden de enumeración.

En segundo lugar, tendrá que tener cuidado con la ruta SortedDictionary con la ruta personalizada IComparer. El comparador se utiliza para la igualdad de claves, así como para ordenar la colección. Es decir, utilizando un IComparer basado en el orden de adición, puede tener dificultad para recuperar un elemento de un SortedDictionary por valor de clave, puede terminar perdido en el árbol (que es el respaldo de un diccionario ordenado).

Si está dispuesto a utilizar la ruta de la Biblioteca de clases genérica C5, puede sacar provecho de un buen número de HashedLinkedList<KeyValuePair<T>> o HashedLinkedList<T> si T tiene autocierre. Puede crear un IEqualityComparer que operará en la clave para generar el código hash. A continuación, recuperar el valor real, puede utilizar Find(ref T x) con un prototipo x (quizás donde sólo se establece la clave), que se encuentra almacenado el T y volver que por referencia en O (1) tiempo frente a O (log n) con un SortedDictionary. Además, al estar respaldado por un LinkedList, está garantizado enumerar en orden adicional (y puede especificar en qué dirección prefiere a través de C5 IDirectedEnumerable).

Espero que ayude.

4

Puede lograr el efecto que desee simplemente usando un List que almacena las teclas por orden de adición. Luego puede enumerar esa lista en orden y recuperar los valores del Dictionary.

Sin embargo, si desea hacer todo esto con un único tipo de colección existente, no conozco un tipo que lo haga sin que necesite proporcionar un comparador o sin que la clave forme parte del elemento. Para el primero, puede probar SortedDictionary y para este último, puede derivar una nueva colección de KeyedCollection (no del todo seguro de que esto mantendría el orden sin un comparador, por lo que necesitaría experimentar para confirmarlo).

0

Usted puede crear su propia clase genérica (y hacer que se derivan de diccionario <,> o SortedDictionary <,>) y poner en práctica su propia versión de GetEnumerator() en el que se puede ordenar el diccionario con llave y devolver los valores ordenados (o si usa SortedDictionary, ya está ordenado).

También podría utilizar una SortedList <,>, que es mejor y más ligera en algunas ocasiones, consulte MSDN para ver cuál se ajusta mejor a sus necesidades.

+0

No estoy buscando el orden "Clave". Estoy después del orden de adición. Aunque considero su punto de heredar y anular GetEnumerator. –

0

Tema ahora es un poco viejo, pero estaba buscando una colección con el mismo comportamiento (conservar el orden en que se agregaron los elementos) Y ser capaz de indexar la colección en una clave. ¡La respuesta es la clase abstracta KeyedCollection <>! (en el espacio de nombres System.Collections.ObjectModel) Ejecuté una prueba simple con un diccionario y este conjunto de claves añadiendo un montón de veces, eliminé uno del medio y volví a agregar el elemento. KeyedCollection agrega el nuevo elemento al final, el Diccionario lo colocó en su posición original (supongo que hay algún tipo de hash pasando)

Cuestiones relacionadas