You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:27:22