2010-06-18 11 views
6

¿Hay una colección en .net que permita el almacenamiento de KeyValuePair<string, string> que mantiene el orden de inserción?
OrderedDictionary parecía prometedor, pero parece ser bastante deficiente.
Ahora estoy buscando en IOrderedEnumerable>, pero parece que no puedo encontrar ninguna implementación a excepción de ISortedDictionary, pero eso no es lo que quiero. No es necesario hacer una clasificación, solo el orden de inserción es importante.¿Lista ordenada de pares de valores clave?

actualización
La razón por la que no me gusta OrderedDictionary es que no es genérico.

+0

OrderedDictionary no está ordenando los valores y puede acceder a los elementos por índice. ¿Qué es exactamente lo que falta? –

+0

'OrderedDictionary' está destinado a lo que estás buscando, desafortunadamente no es genérico. Más allá de eso, ¿hay algo más que falta en lo que estás buscando? Obtendrá mejores respuestas si puede aclarar lo que está buscando (y por qué las clases integradas no satisfacen sus necesidades). – LBushkin

+0

Me gustaría evadir todo el casting si es posible. –

Respuesta

7

OrderedDictionary es lo que desea si necesita tanto el acceso con llave y la inserción-secuenciado a artículos ... en realidad es solo una combinación de una tabla hash y una lista. Proporciona un medio para acceder a los elementos en él, ya sea por índice de inserción o por clave. Es la única colección en .NET que hace esto. Lamentablemente, no es genérico.

Si OrderedDictionary no satisface sus necesidades únicamente porque no es genérico, puede usar the version here that provides a generic equivalent. Si hay otros motivos por los que no funciona, actualice su publicación y podremos buscar una mejor opción.

Aunque ciertamente puede crear su propio List<KeyValuePair<string,string>>, perderá la opción de buscar por clave de manera eficiente. Ahora, ciertamente puede implementar su propia aplicación de un doccionario ordenado que combina la lista/dict juntos ... pero la publicación a la que me he vinculado ya lo hace.

+0

Eso resume mis opciones muy bien. Como de todos modos no necesitaré la búsqueda clave, voy con IList. Gracias –

7

Simplemente use List<KeyValuePair<T,T>>. Se almacenan por orden de inserción. Cada vez que lo agrega, el más nuevo se agrega al final de la lista.

por lo

var list = new List<KeyValuePair<String,String>>(); 

list.Add(new KeyValuePair<String,String>("","")); 

Si quieres sacarlos con el fin sólo tiene que utilizar:

list.ForEach(x=>...); 

o

foreach(var item in list){ 
...} 
+0

¿Se garantiza que List lo mantenga en orden? –

+1

Sí, tiene que hacerlo, porque puede acceder a los elementos directamente tal como lo hace con una matriz Lista [0] ... etc. – kemiller2002

0

Usted sólo debe ser capaz de utilizar un List<KeyValuePair<string,string>>. En realidad no puedo encontrar en la documentación de MSDN indica que el orden de inserción está garantizada, pero es una apuesta bastante segura ...

6

Aunque llego tarde al juego, .NET Framework 4.5 ofrece nuevas clases para ti. Ver SortedList<TKey, TValue> o SortedDictionary<TKey, TValue>. Si se pregunta cuál debería usar, MSDN proporciona algunas buenas razones por las que puede elegir una sobre la otra.

La clase genérica SortedList es una matriz de pares clave/valor con recuperación O (log n), donde n es el número de elementos en el diccionario. En esto, es similar a la clase genérica SortedDictionary. Las dos clases tienen modelos de objetos similares, y ambos tienen recuperación O (log n).Cuando las dos clases difieren es en el uso de memoria y la velocidad de inserción y extracción:

  • SortedList<TKey, TValue> utiliza menos memoria que SortedDictionary<TKey, TValue>.
  • SortedDictionary<TKey, TValue> tiene operaciones más rápidas de inserción y eliminación de datos sin clasificar, O (log n) en oposición a O (n) para SortedList<TKey, TValue>.
  • Si la lista se rellena todos a la vez a partir de datos ordenados, SortedList<TKey, TValue> es más rápido que SortedDictionary<TKey, TValue>.

Otra diferencia entre las clases SortedDictionary<TKey, TValue> y SortedList<TKey, TValue> es que SortedList<TKey, TValue> apoya recuperación indizada eficiente de claves y valores a través de las colecciones devueltos por las claves y valores de propiedades. No es necesario regenerar las listas cuando se accede a las propiedades, porque las listas son solo envoltorios para las matrices internas de claves y valores.

Ambos enlaces tienen una sección Comentarios similar (que es de donde proviene la cita). También tienen más información para ambas clases. Recomiendo leer ambas secciones si está interesado en usar una de ellas.

Cuestiones relacionadas