Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是字典中的键<;TKey,TValue>;不变的_C#_.net_Collections_Generics - Fatal编程技术网

C# 是字典中的键<;TKey,TValue>;不变的

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"

我从API获得了一个
字典
,但根据某些规则,需要修改一些键名


在我开始复制到新的
字典之前,我只想确认
字典中的键是不可变的。

你是对的,如果键发生变化,你需要用旧键删除条目,用新键插入新条目

如果只更改了部分键,则不需要复制整个字典。
字典上的添加和删除操作大致都是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
定义的等价类需要是不可变的。请注意,为所有类类型定义了一个合适的等价类——引用相等——实际上,这是唯一应该用于可变对象的等价类。如果字典的目的是将可变类类型的实例与其他类型相关联,那么将可变类类型作为字典键没有任何错误。