如何实现Dictionary<string, object>异构容器的递归展平遍历函数
问题根因
你当前写的flatten函数的核心问题是:递归调用flatten(subDict)时,没有遍历递归返回的枚举结果并逐个返回,嵌套字典中的键值对全部没有被纳入最终的返回序列,所以得到的结果不符合预期。
修正后实现(无需依赖LINQ的SelectMany)
public IEnumerable<KeyValuePair<string, object>> flatten(IDictionary<string, object> dict) { foreach(KeyValuePair<string, object> item in dict) { if (item.Value is IDictionary<string, object> subDict) { // 迭代递归返回的所有子键值对,逐个返回 foreach (var subItem in flatten(subDict)) { yield return subItem; } } else { yield return item; } } }
逻辑说明
- 遍历输入字典的每一组键值对
- 若当前值为
IDictionary<string, object>类型的嵌套字典,就递归调用flatten方法处理该嵌套字典,再把递归得到的所有子键值对逐个yield返回 - 若当前值不是字典类型,直接yield返回当前键值对
执行var l = flatten(d).ToList();后,得到的列表就会包含key1、key2、key3对应的3个元素,完全满足需求。
内容的提问来源于stack exchange,提问作者malat
相关产品推荐
相关产品推荐

