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
相关产品推荐
相关产品推荐

