如何向C# Dictionary中已存在的键对应的值追加更多元素?
解决方案
该需求完全可实现,你当前的实现存在几个明显问题:
- 字典值采用
object类型存储,后续取值需要额外类型转换,容易触发类型不匹配的运行时错误 - 数组声明语法错误:C# 不支持
new Array[4]{1, 2, 3, 4}的写法,需要明确指定数组的元素类型 - 数组合并逻辑错误:现有写法是把
temp、temp2两个数组整体作为单个元素塞入新数组,而非合并两个数组的内部元素 - 手动循环拼接数组的代码冗余,效率较低
优化实现(数组存储)
如果你需要保留数组作为字典值的结构,可以参考以下简化实现:
// 直接定义字典值类型为object[],避免后续类型转换 var dic = new Dictionary<int, object[]>(); foreach(var item in Fields) { // 替换为实际需要追加的元素 var newElements = new object[] { 1, 2, 3, 4 }; if (dic.ContainsKey(item.Key)) { // 拼接两个数组的元素后覆盖原有值 dic[item.Key] = dic[item.Key].Concat(newElements).ToArray(); } else { // 键不存在时完成初始化 dic[item.Key] = newElements; } }
更推荐的实现(List存储)
如果没有强制要求用数组存储值,建议将字典值类型改为List<object>,原生支持批量追加元素,操作性能和便利性更高:
var dic = new Dictionary<int, List<object>>(); foreach(var item in Fields) { // 替换为实际需要追加的元素 var newElements = new List<object> { 1, 2, 3, 4 }; if (dic.TryGetValue(item.Key, out var existingList)) { // 直接在原有集合上追加元素,不需要重新创建集合 existingList.AddRange(newElements); } else { dic[item.Key] = newElements; } } // 后续需要数组时可随时调用 .ToArray() 方法转换
如果你必须保留Dictionary<int, object>的类型定义,需要在取值时增加类型校验逻辑,避免运行时报错:
var dic = new Dictionary<int, object>(); foreach(var item in Fields) { var newElements = new object[] { 1, 2, 3, 4 }; if (dic.TryGetValue(item.Key, out var value)) { if (value is object[] existingArr) { dic[item.Key] = existingArr.Concat(newElements).ToArray(); } } else { dic[item.Key] = newElements; } }
内容的提问来源于stack exchange,提问作者Weenhallo
相关产品推荐
相关产品推荐

