C#嵌套字典添加值列表与新键报错:Add方法无单参数重载
解决嵌套字典操作中的"No overload for method 'Add' takes 1 arguments"错误
先帮你理清楚问题的核心原因和修复方案:
错误根源
- 方法参数不匹配:
dict[typeValue]返回的是Dictionary<int, List<dynamic>>类型的对象,它的Add方法要求传入两个参数(要添加的键和对应的值),但你直接传了整个innerDict对象,完全不符合方法的参数要求,因此触发报错。 - 逻辑冗余:你已经通过
Dictionary<int, List<dynamic>> innerDict = dict[typeValue];让innerDict成为父字典内层字典的引用——也就是说,对innerDict做的任何修改(比如添加键、往列表里加元素)都会直接作用在dict[typeValue]上,根本不需要再调用dict[typeValue].Add(innerDict)这行代码。
另外你的代码里还有两个小笔误:
dict.Add(typeValue, new Dictionary<int, List<dynamic>>();少了一个闭合括号innerDict[move.id].Add(mode)里的move.id应该是mode.id
修复后的完整代码
dynamic mode = AnotherFunction(); foreach(var typeValue in Type) { if(!dict.ContainsKey(typeValue)) { // 添加父字典键并初始化内层字典 dict.Add(typeValue, new Dictionary<int, List<dynamic>>()); } // 获取内层字典的引用 Dictionary<int, List<dynamic>> innerDict = dict[typeValue]; if(!innerDict.ContainsKey(mode.id)) { // 初始化内层字典键对应的列表 innerDict.Add(mode.id, new List<dynamic>()); } // 将mode添加到对应列表 innerDict[mode.id].Add(mode); // 移除原来报错的冗余代码 }
可选优化:更简洁的写法
如果使用C# 6及以上版本,可以用TryGetValue简化判断逻辑,同时避免重复查找字典键的性能损耗:
dynamic mode = AnotherFunction(); foreach(var typeValue in Type) { // 尝试获取内层字典,不存在则创建并添加到父字典 if(!dict.TryGetValue(typeValue, out var innerDict)) { innerDict = new Dictionary<int, List<dynamic>>(); dict[typeValue] = innerDict; } // 尝试获取目标列表,不存在则创建并添加到内层字典 if(!innerDict.TryGetValue(mode.id, out var modeList)) { modeList = new List<dynamic>(); innerDict[mode.id] = modeList; } // 添加元素到列表 modeList.Add(mode); }
内容的提问来源于stack exchange,提问作者Luxior
相关产品推荐
相关产品推荐

