You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dictionary键无法修改报错:Property or indexer cannot be assigned to: it is read only

解决Dictionary键无法修改的问题

嘿,这个报错我之前踩过坑!咱们先搞懂为什么会出现这个问题:

.NET里的KeyValuePair<TKey, TValue>的Key属性是只读的,这不是bug,是故意设计的——字典的核心是用键的哈希值来快速定位数据,如果允许直接修改键,会彻底打乱字典内部的哈希索引结构,导致后续的查找、添加操作全部失效。所以微软干脆把Key设成了只读,不让你直接赋值。

那想修改字典的键怎么办?唯一安全的方式是:删除旧的键值对,再添加新键+原有值。不过还要注意一个坑:遍历字典的时候直接修改(删/加)会触发InvalidOperationException,所以得先把要处理的条目复制一份再操作。

结合你的代码场景,你想要把每个字典条目的Key替换成对应Value列表里的第i个元素,我帮你调整了代码:

// 先把字典条目转成列表,避免遍历原字典时修改引发异常
var dictionaryEntries = SuggestedDictionary.ToList();

for (int i = 0; i < 10; i++) {
    foreach (var entry in dictionaryEntries) {
        // 先完成你需要的分数计算和添加操作
        rec.Add(new Recommendations() { bookName = entry.Key, Rate = CalculateScore(bkName, entry.Key) });

        // 检查原键是否还在字典里(防止重复操作导致的问题)
        if (SuggestedDictionary.ContainsKey(entry.Key)) {
            var originalValue = entry.Value;
            
            // 先移除旧的键值对
            SuggestedDictionary.Remove(entry.Key);

            // 获取新键,这里要注意索引越界问题!
            if (i >= originalValue.Count) {
                // 可以加个日志或者默认处理,避免崩溃
                continue;
            }
            var newKey = originalValue[i];

            // 添加新的键值对,处理新键已存在的情况
            if (SuggestedDictionary.ContainsKey(newKey)) {
                // 这里根据你的业务需求调整:是覆盖还是合并值?
                SuggestedDictionary[newKey] = originalValue;
            } else {
                SuggestedDictionary.Add(newKey, originalValue);
            }
        }
    }
}

额外提几个注意点:

  • 一定要加i >= originalValue.Count的判断,不然当i超过列表长度时会抛出索引越界异常。
  • 如果新键已经存在于字典中,你得根据业务逻辑决定怎么处理:是覆盖原有值,还是把两个值列表合并?上面的代码用了覆盖,你可以按需修改。
  • 为什么要转成ToList()?因为直接遍历SuggestedDictionary时修改字典,.NET会检测到集合被修改,直接抛出异常,先复制到列表就可以安全操作了。

内容的提问来源于stack exchange,提问作者Muhammad Shahid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:02:57