4

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!

4

3 回答 3

10

我会使用TryGetValue方法而不是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);
    }
}

但是你仍然需要先获取价值,用另一个键添加它并删除旧的。你不能以任何其他方式做到这一点。

顺便说一句:您可以使该方法泛型以对不止一种字典类型进行操作:

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);
    }
}

或者您可以在以下事件中编写自己的扩展方法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);
        }
    }
}

然后像标准Dictionary方法一样调用它:

myDict.UpdateKey(oldKey, newKey);
于 2013-04-27T18:11:23.927 回答
2

没有这样的选项,因为更改键不是简单的替换,而是可能需要重建内部字典结构的复杂操作。

如果字典有这样的方法,它也会这样做——删除和添加。

为了简化你的代码,你可以创建一个扩展方法来做这件事。

于 2013-04-27T18:12:09.927 回答
2

简而言之,没有。您必须删除并重新添加它。如果有一个内置的方法来做到这一点,它必须做同样的事情。

想想你在问什么,你会明白为什么删除和添加是必须完成的合乎逻辑的方式。想想如何在底层实现字典。更改密钥意味着什么?

首先,字典保留一个条目结构。由于每个条目都是一个结构,因此它是值类型的,因此无法就地更新。当然,Entry 可以表示为对象而不是结构,但他这样做的目的是什么?对于真正的边缘情况,这将是一种处理数据的效率较低的方法。

其次,在基本级别,字典将哈希值映射到项目。由于散列的数量是有限的,因此实际上使用存储桶以更复杂的方式进行映射。这意味着您不能只是简单地更改值(即使底层结构允许我们这样做)。在这种情况下,您基本上必须做的是删除键和映射,然后将它们添加回来。在这种情况下,代码正在执行您编写的操作。

一般来说,键应该是关于不会因为这个困难而改变的值的东西,所以没有内置的方法来做你写的事情(当然它可以比你写的更干净),但基本操作有无论在何处或如何实施,都可以删除和添加。

查看源代码以了解字典实际工作原理的详细信息,以便更深入地理解。

于 2013-04-27T18:32:32.033 回答