C# 是字典中的键<;TKey,TValue>;不变的
我从API获得了一个C# 是字典中的键<;TKey,TValue>;不变的,c#,.net,collections,generics,C#,.net,Collections,Generics,我从API获得了一个字典,但根据某些规则,需要修改一些键名 在我开始复制到新的字典之前,我只想确认字典中的键是不可变的。你是对的,如果键发生变化,你需要用旧键删除条目,用新键插入新条目 如果只更改了部分键,则不需要复制整个字典。字典上的添加和删除操作大致都是O(1)操作。字典中的键是不可变的 例如,以下代码: Dictionary<string, string> dict = new Dictionary<string, string>(); dict.Add("One"
字典
,但根据某些规则,需要修改一些键名
在我开始复制到新的
字典之前,我只想确认字典中的键是不可变的。你是对的,如果键发生变化,你需要用旧键删除条目,用新键插入新条目
如果只更改了部分键,则不需要复制整个字典。字典上的添加和删除操作大致都是O(1)操作。字典中的键是不可变的
例如,以下代码:
Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("One", "1");
dict.Add("Two", "2");
var k = dict.First();
k.Key = "Three";
Dictionary dict=new Dictionary();
添加(“一”、“1”);
添加(“二”、“二”);
var k=dict.First();
k、 Key=“三”;
将抛出以下编译器错误:
属性或索引器
'System.Collections.Generic.KeyValuePair.Key'
无法分配给--它已被读取
只有
也就是说,如果使用引用类型,词典可能会有可变键,请参见:
(我知道,我知道,字符串是引用类型…但上面的链接将解释…更像是您必须确保用于TKey
的类型是不可变的,如果它是引用类型。顺便说一下,字符串是不可变的。值类型可以是可变的,但是您没有机会修改字典中存储的键
只有GetHashCode
值和由Equals
定义的等价类需要是不可变的。请注意,为所有类类型定义了一个合适的等价类——引用相等——实际上,这是唯一应该用于可变对象的等价类。如果字典的目的是将可变类类型的实例与其他类型相关联,那么将可变类类型作为字典键没有任何错误。