有没有办法直接在.NET中更新Dictionary的Key元素?

时间:2013-04-27 18:08:13

标签: c# .net dictionary key-value

目前,我没有别的办法(间接更新):

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

你还有另一种更好的方式吗?

当然上面的方法只是一个简单的方法,为了使它运行良好而不抛出任何异常,我们必须检查newKey是否与Dictionary中已有的键重复。像这样:

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

非常感谢你!

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

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

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

为简化您的代码,您可以创建一个可以实现此目的的扩展方法。

答案 2 :(得分:2)

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

考虑一下您的要求,您会看到为什么删除和添加是必须完成的逻辑方式。想想如何在引擎盖下实现字典。更改密钥意味着什么?

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

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

一般情况下,键应该是关于价值的东西,因为这个难度不能精确地改变所以没有内置的方法来做你写的东西(授予它可以做得比你写的更干净),但是无论在何处或如何实施,基本操作都必须是删除和添加。

查看source code,了解字典实际上如何以更深入的方式理解的详细信息。