C#向Dictionary<string, List<string>>添加元素时的报错原因咨询
C#向Dictionary<string, List>添加元素时的报错原因咨询
嗨,我来给你把这个问题拆解清楚哈~
首先得明确你定义的Dictionary<string, List<string>>的本质:这个字典的键是string类型,而值必须是List<string>类型的集合,不是单个的string元素,这是核心关键点!
先说说你第一种写法为啥没问题:
- 当你用
foundItems[targetColumns[i]].Add(value)时,字典的索引器[]会先查找键targetColumns[i]:- 如果键已经存在,直接返回对应的
List<string>集合对象,你调用Add(value)就是往这个集合里追加单个string元素,完全符合类型要求; - 如果键不存在,索引器还会自动帮你创建一个空的
List<string>并添加到字典中,再返回这个新集合,之后你加value也完全没问题。
- 如果键已经存在,直接返回对应的
再看你报错的第二种写法foundItems.Add(targetColumns[i], value):
字典的Add方法有严格的类型要求,第二个参数必须和字典定义的值类型完全匹配——也就是得传一个List<string>,但你现在传的是单个string类型的value,这就直接触发了“无法将string转换为List
哪怕这个键之前完全不存在,你这么写也会报错。如果想给新键添加第一个元素,正确的写法应该是先创建一个包含value的列表,再传给Add方法:
foundItems.Add(targetColumns[i], new List<string> { value });
最后再给你补充两种常用的正确操作场景:
- 不确定键是否存在,直接追加元素:就用你最开始的
foundItems[targetColumns[i]].Add(value),简单省心; - 想先判断键是否存在再操作,避免索引器自动创建空列表的情况(比如某些场景下你不想自动创建):可以用
TryGetValue:
if (foundItems.TryGetValue(targetColumns[i], out var itemList)) { itemList.Add(value); } else { // 键不存在时再创建新列表添加 foundItems[targetColumns[i]] = new List<string> { value }; }
内容来源于stack exchange
相关产品推荐
相关产品推荐

