【问题标题】:Are the keys in a Dictionary<TKey, TValue> immutable?Dictionary<TKey, TValue> 中的键是不可变的吗?
【发布时间】:2011-04-24 10:57:08
【问题描述】:

我从 API 得到了一个 Dictionary&lt;string, string&gt;,但根据某些规则需要修改一些键名。

在我开始复制到新的Dictionary 之前,我只想确认Dictionary&lt;TKey, TValue&gt; 中的键是不可变的。

【问题讨论】:

    标签: c# .net collections generics


    【解决方案1】:

    你是对的,如果密钥发生变化,你需要用旧密钥删除条目并用新密钥插入一个新条目。

    如果只有部分键发生变化,则不需要复制整个字典。 Dictionary 上的 Add 和 Remove 操作都大约是 O(1) 操作。

    【讨论】:

      【解决方案2】:

      更像是必须确保你用于TKey的类型是不可变的,如果它是一个引用类型。顺便说一句,字符串是不可变的。值类型可以是可变的,但您没有机会修改 Dictionary 中存储的密钥。

      【讨论】:

      • 只有GetHashCode 值和Equals 定义的等价类需要是不可变的。请注意,为所有类类型定义了一个合适的等价类——引用相等——实际上,这通常是唯一应该用于可变对象的等价类。如果字典的目的是将该类型的实例与其他内容相关联,那么将可变类类型作为字典键没有任何问题。
      【解决方案3】:

      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

      (我知道,我知道,字符串是引用类型……但上面的链接会解释……)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-09
        • 2016-06-14
        • 1970-01-01
        • 2011-04-11
        • 1970-01-01
        相关资源
        最近更新 更多