目前,我没有别的办法(间接更新):
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;
}
}
非常感谢你!
答案 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,了解字典实际上如何以更深入的方式理解的详细信息。