Is there any way to update the Key element of a Dictionary directly in .NET?

.net, c#, dictionary, key-value

Solution

I would use `TryGetValue` method instead of `Contains`:

private void UpdateKey(Dictionary<string,object> dict, string oldKey, string newKey){
    object value;
    if(dict.TryGetValue(oldKey, out value)){
          dict.Remove(oldKey);
          dict.Add(newKey, value);
    }
}

But you still need to get value first, add it with another key and remove the old one. You can't do it any other way.

By the way: you can make the method generic to operate on more then just one dictionary type:

private static void UpdateKey<TKye, TValue>(Dictionary<TKey, TValue> dict, TKey oldKey, TKey newKey){
    TValue value;
    if(dict.TryGetValue(oldKey, out value)){
          dict.Remove(oldKey);
          dict.Add(newKey, value);
    }
}

Or you can event write your own Extension method on `IDictionary<TKey, TValue>`:

public static class DictionaryExtensions
{
    public static void UpdateKey<TKye, TValue>(this IDictionary<TKey, TValue> dict, TKey oldKey, TKey newKey){
        TValue value;
        if(dict.TryGetValue(oldKey, out value)){
              dict.Remove(oldKey);
              dict.Add(newKey, value);
        }
    }
}

and then call it like standard `Dictionary` method:

myDict.UpdateKey(oldKey, newKey);

Problem

At the moment, I have no other way than this one (an indirect update): ``` private void UpdateKey(Dictionary<string,object> dict, string oldKey, string newKey){ if(dict.ContainsKey(oldKey)){ object value = dict[oldKey]; dict.Remove(oldKey); dict.Add(newKey,value); } } ``` Do you have another better way? Of course the above method is just a simple one, to make it work well without throwing any exception, we have to check the newKey for duplication with already keys in the Dictionary. Like this: ``` private void UpdateKey(Dictionary<string,object> dict, string oldKey, string newKey){ if(dict.ContainsKey(oldKey)){ object value = dict[oldKey]; dict.Remove(oldKey); dict[newKey] = value; } } ``` Thank you very much in advance!

Original source