2010-12-18 5 views
5

Según MSDN:enumerar a través de un Dictionary.KeyCollection con el fin

El orden de las teclas en el Dictionary.KeyCollection es no especificado

Estoy asumiendo que esto es debido a adiciones el diccionario se coloca en una especie de tabla hash.

Sin embargo, me gustaría devolver la colección .Keys de un diccionario como un IEnumerable (o tal vez como una colección) de un método, y enumerarlos en el orden en que se agregaron originalmente al diccionario.

¿Cuál es la mejor manera de lograr esto?

(estoy usando Windows Forms, .NET 2,0)

Respuesta

5

Seguidamente, mantenga las teclas por separado en un List<T>. Esa orden original ya no existe en el diccionario. La lista repetirá el orden de inserción.

+0

Pensé en usar otra lista pero que parecía una duplicación si no fuera necesario, y me preguntaba si había algo que me faltaba en el diccionario. Sin embargo, si esa es de hecho la manera de hacerlo, entonces no hay problema, gracias. – Andy

2

Puede usar List<KeyValuePair<K,V>> en lugar de Dictionary<K,V> para mantener el orden. El problema con esto, por supuesto, es que se vuelve más difícil actualizar el valor de una clave y el hecho de que puede tener claves duplicadas. Pero que puede ser manejado con estos métodos de extensión

public static void AddOrUpdate<K, V>(this List<KeyValuePair<K, V>> list, K key, V value) 
    { 
     var pair = list.SingleOrDefault(kvp => kvp.Key.Equals(key)); 
     if (!pair.Equals(null)) 
      list.Remove(pair); 
     list.Add(new KeyValuePair<K, V>(key, value)); 
    } 

    public static V GetValue<K, V>(this List<KeyValuePair<K, V>> list, K key) 
    { 
     var pair = list.SingleOrDefault(kvp => kvp.Key.Equals(key)); 
     if (pair.Equals(null)) 
      return default(V); //or throw an exception 
     return pair.Value; 
    } 

    public static bool ContainsKey<K, V>(this List<KeyValuePair<K, V>> list, K key) 
    { 
     return list.Any(kvp => kvp.Key.Equals(key)); 
    } 
+0

Gracias por su respuesta, funcionaría, pero debo asegurar la exclusividad de cada clave que agregue. List.Contains no es tan eficiente como Dictionary.ContainsKey, especialmente si hay muchos elementos que no creo. – Andy

+0

@Andy Sí, no es ideal, pero es una opción más mantener una lista separada de claves. – juharr

+0

Sí, definitivamente algo para tener en cuenta, gracias. – Andy

0

Tal SortedDictionary podría hacer lo que necesita si la clave está en el orden de inserción (1, 2, 3, ... etc.)

Cuestiones relacionadas