【发布时间】:2011-04-24 10:57:08
【问题描述】:
我从 API 得到了一个 Dictionary<string, string>,但根据某些规则需要修改一些键名。
在我开始复制到新的Dictionary 之前,我只想确认Dictionary<TKey, TValue> 中的键是不可变的。
【问题讨论】:
标签: c# .net collections generics
我从 API 得到了一个 Dictionary<string, string>,但根据某些规则需要修改一些键名。
在我开始复制到新的Dictionary 之前,我只想确认Dictionary<TKey, TValue> 中的键是不可变的。
【问题讨论】:
标签: c# .net collections generics
你是对的,如果密钥发生变化,你需要用旧密钥删除条目并用新密钥插入一个新条目。
如果只有部分键发生变化,则不需要复制整个字典。 Dictionary 上的 Add 和 Remove 操作都大约是 O(1) 操作。
【讨论】:
更像是你必须确保你用于TKey的类型是不可变的,如果它是一个引用类型。顺便说一句,字符串是不可变的。值类型可以是可变的,但您没有机会修改 Dictionary 中存储的密钥。
【讨论】:
GetHashCode 值和Equals 定义的等价类需要是不可变的。请注意,为所有类类型定义了一个合适的等价类——引用相等——实际上,这通常是唯一应该用于可变对象的等价类。如果字典的目的是将该类型的实例与其他内容相关联,那么将可变类类型作为字典键没有任何问题。
Dictionary
比如下面的代码:
Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("One", "1");
dict.Add("Two", "2");
var k = dict.First();
k.Key = "Three";
会抛出以下编译错误:
属性或索引器 'System.Collections.Generic.KeyValuePair.Key' 不能分配给——它被读取 只有
话虽如此,如果您使用引用类型, Dictionary
C# Dictionary<> and mutable keys
(我知道,我知道,字符串是引用类型……但上面的链接会解释……)
【讨论】: