C#使用Dictionary填充点分隔路径层级结构的实现问题
基于Dictionary构建点分路径层级结构方案
问题场景
需要读取随机传入的点分隔格式字符串,基于Dictionary<string, JsonElement>构建完整的嵌套层级结构,输入字符串示例如下:
address.city.streetname.housenumber address.areacode address.city.streetname.coAddress
节点结构定义为包含父节点名称、当前节点名称、子节点列表三个属性。
原有代码逻辑问题
- 方法调用参数缺失:遍历字符串列表时调用
AddElementsToHierarchy()未传入方法定义要求的层级字典、当前处理路径两个入参,无法通过编译 - 节点属性初始化不全:新建
JsonElement实例时未初始化childrenJsonElements列表、未给根节点赋值name属性,后续运行会触发空引用异常 - 层级遍历逻辑错误:遍历路径段时直接覆盖当前节点的
parent、name属性,未做子节点存在性校验,也没有逐层向下遍历的逻辑,会导致已有节点数据被覆盖,无法形成嵌套关系 - 变量拼写错误:方法内返回的变量名为
dictionaryJsonHierarchy,和入参名称不一致,编译报错
可运行实现代码
实现逻辑:逐路径拆分后从根节点开始逐层校验,当前层级不存在对应名称的节点则新建并挂载到父节点的子列表,存在则直接进入该子节点继续向下遍历,直到路径所有段处理完成。
public class JsonElement { public string parent { get; set; } public string name { get; set; } // 声明时直接初始化子节点列表,避免空引用 public List<JsonElement> childrenJsonElements { get; set; } = new List<JsonElement>(); } // 初始化根节点字典 var dictionaryHierarchy = new Dictionary<string, JsonElement>(); List<string> pathList = new List<string>() { "address.city.streetname.housenumber", "address.areacode", "address.city.streetname.coAddress" }; foreach (string path in pathList) { // 拆分路径,自动忽略空段 string[] pathSegments = path.Split('.', StringSplitOptions.RemoveEmptyEntries); if (pathSegments.Length == 0) continue; // 初始化根节点 string rootName = pathSegments[0]; if (!dictionaryHierarchy.ContainsKey(rootName)) { dictionaryHierarchy.Add(rootName, new JsonElement { name = rootName, parent = null }); } // 从根节点开始逐层向下构建 JsonElement current = dictionaryHierarchy[rootName]; for (int i = 1; i < pathSegments.Length; i++) { string segmentName = pathSegments[i]; // 查找当前节点下是否已存在同名子节点 JsonElement targetChild = current.childrenJsonElements.FirstOrDefault(c => c.name == segmentName); if (targetChild == null) { targetChild = new JsonElement { name = segmentName, parent = current.name }; current.childrenJsonElements.Add(targetChild); } // 移动到子节点,处理下一层级 current = targetChild; } }
最终生成的层级结构:
- 根节点
address- 子节点
areacode(叶子节点) - 子节点
city- 子节点
streetname- 子节点
housenumber(叶子节点) - 子节点
coAddress(叶子节点)
- 子节点
- 子节点
- 子节点
内容的提问来源于stack exchange,提问作者Tech develop
相关产品推荐
相关产品推荐

