2011-06-27 15 views
21

Zastanawiam się czy istnieje lepszy sposób na zmianę klucza słownika, na przykład:Najlepszy sposób na zmianę słownika klucz

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

a później postanowiłem zrobić parę klucz wartość, aby być („b”, 1), czy można zmienić nazwę klucza zamiast dodawać nową parę wartości klucza ("b", 1), a następnie usunąć "a"?

Z góry dziękuję.

Odpowiedz

48

Nie, nie można zmienić nazw klawiszy, które zostały dodane do słownika. Jeśli chcesz siłownia zmienić, może dodać własną metodę rozszerzenia:

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

Lepszym nazewnictwa jest 'ChangeKey' lub' UpdateKey' :) – nawfal

15

Dictionary w C# jest realizowany jako hashtable. Dlatego, gdybyś był w stanie zmienić klucz za pomocą jakiejś metody Dictionary.ChangeKey, wpis musiał zostać ponownie zakodowany. Więc nie jest tak naprawdę inaczej (poza wygodą) niż usunięcie wpisu, a następnie dodanie go ponownie za pomocą nowego klucza.

+2

+1 za powiedzenie dlaczego to nie różni się od tego, co robi teraz – 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; 
} 

samo jak odpowiedź Colina, ale nie rzucać wyjątek, a nie zwraca false na niepowodzenie. W rzeczywistości jestem zdania, że ​​taka metoda powinna być domyślna w klasie słownika, ponieważ edycja wartości klucza jest niebezpieczna, więc sama klasa powinna dać nam opcję, aby być bezpiecznym.

2

używam Linq zmienić moje klucze słownika (zregenerować słownika przez linq)

Na przykład używam następujący kod do zastąpienia '_' z '-' we wszystkich kluczy tylko przez jednego polecenia:

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

magia krokiem jest ToDictionary() metoda.


Uwaga: Możemy zaawansowanym Wybierz zawierać blok kodów dla skomplikowanych przypadkach zamiast prostego lambda.

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

      return resultKeyValuePair; 
     }) 
Powiązane problemy