2011-06-27 16 views
21

Me pregunto ¿existe una mejor manera de cambiar una clave de diccionario, por ejemplo:mejor manera de cambiar el diccionario de clave

var dic = new Dictionary<string, int>(); 
dic.Add("a", 1); 

y más tarde decidí hacer valor de par de claves para ser ("b", 1), ¿es posible cambiar el nombre de la clave en lugar de agregar un nuevo par de valores clave ("b", 1) y luego eliminar "a"?

Gracias de antemano.

Respuesta

48

No, no puede cambiar el nombre de las claves una vez que se han agregado a un diccionario. Si desea una instalación de cambio de nombre, tal vez añadir su método de extensión:

public static void RenameKey<TKey, TValue>(this IDictionary<TKey, TValue> dic, 
             TKey fromKey, TKey toKey) 
{ 
    TValue value = dic[fromKey]; 
    dic.Remove(fromKey); 
    dic[toKey] = value; 
} 
+4

Una mejor denominación es '' ChangeKey' o UpdateKey' :) – nawfal

15

El Dictionary en C# se implementa como una tabla hash. Por lo tanto, si fue capaz de cambiar la clave a través de algún método Dictionary.ChangeKey, la entrada debería volver a codificarse. Por lo tanto, no es realmente diferente (aparte de la conveniencia) que eliminar la entrada y luego volver a agregarla con la nueva clave.

+2

1 para decir qué no es diferente de lo que está haciendo ahora – TruthOf42

5
public static bool ChangeKey<TKey, TValue>(this IDictionary<TKey, TValue> dict, 
              TKey oldKey, TKey newKey) 
{ 
    TValue value; 
    if (!dict.TryGetValue(oldKey, out value)) 
     return false; 

    dict.Remove(oldKey); // do not change order 
    dict[newKey] = value; // or dict.Add(newKey, value) depending on ur comfort 
    return true; 
} 

Igual que la respuesta de Colin, pero no lanza una excepción, en lugar devuelve false en caso de fallo. De hecho, soy de la opinión de que dicho método debería ser el predeterminado en la clase de diccionario, teniendo en cuenta que editar el valor de la clave es peligroso, por lo que la clase en sí debería darnos una opción para estar seguros.

2

utilizo LINQ cambiar mis claves de diccionario (regenerar un diccionario por linq)

Por ejemplo yo uso el siguiente código para reemplazar '_' con '-' en todas las teclas con sólo un comando:

var newDictionary= oldDictionary 
        .Select(x=> new KeyValuePair<string, object>(x.Key.Replace("_", "-"), x.Value)) 
        .ToDictionary(x=> x.Key,x=> x.Value); 

El paso de la magia es ToDictionary() método.


Nota: Podemos hacer un avanzado Seleccionar incluye un bloque de códigos para los casos complicados en lugar de un simple lambda.

Select(item =>{ 
      .....Write your Logic Codes Here.... 

      return resultKeyValuePair; 
     }) 
Cuestiones relacionadas