You need to enable JavaScript to run this app. C# 如何基于文件夹路径为RazorTree列表节点映射赋值parentId
优惠活动
大模型
产品
解决方案
定价
更多

C# 如何基于文件夹路径为RazorTree列表节点映射赋值parentId

实现思路

核心逻辑是通过路径的层级关系匹配父子节点,步骤如下:

  1. 先统一标准化所有节点的路径格式,消除末尾斜杠、大小写差异带来的匹配问题
  2. 按路径层级从浅到深排序节点,保证处理子节点时父节点已经完成录入
  3. 遍历节点时匹配对应父路径,完成parentId赋值

完整实现代码

using System.IO;
using System.Collections.Generic;
using System.Linq;

// 你的RazorTree类定义
public class RazorTree
{
    public int id { get; set; }
    public string Name { get; set; }        
    public string Path { get; set; }
    public int? parentId { get; set; } = null;
}

public static void SetParentIds(List<RazorTree> razorTreeList)
{
    // 1. 标准化所有节点路径
    foreach (var node in razorTreeList)
    {
        // 转为全路径,去除末尾分隔符,统一转小写适配Windows不区分路径大小写的特性
        node.Path = Path.GetFullPath(node.Path)
            .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
            .ToLowerInvariant();
    }

    // 2. 按路径层级从浅到深排序(分隔符越少层级越高)
    var sortedNodes = razorTreeList
        .OrderBy(n => n.Path.Count(c => c == Path.DirectorySeparatorChar || c == Path.AltDirectorySeparatorChar))
        .ToList();

    // 路径到节点ID的映射字典,用于快速查找父节点
    var pathToIdMap = new Dictionary<string, int>();

    foreach (var node in sortedNodes)
    {
        // 方案1:按文件系统父目录匹配(符合常规目录父子逻辑)
        var parentPath = Path.GetDirectoryName(node.Path);
        if (!string.IsNullOrEmpty(parentPath))
        {
            // 标准化父路径后匹配
            var normalizedParentPath = parentPath
                .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
                .ToLowerInvariant();
            if (pathToIdMap.TryGetValue(normalizedParentPath, out var parentId))
            {
                node.parentId = parentId;
            }
        }

        /* 方案2:最长前缀匹配(适配你示例中id55关联id45的特殊需求,如果是路径前缀规则就用这个)
        var matchedParents = pathToIdMap
            .Where(kv => node.Path.StartsWith(kv.Key + Path.DirectorySeparatorChar) 
                      || node.Path.StartsWith(kv.Key + Path.AltDirectorySeparatorChar))
            .OrderByDescending(kv => kv.Key.Length)
            .FirstOrDefault();
        if (matchedParents.Key != null)
        {
            node.parentId = matchedParents.Value;
        }
        */

        // 当前节点录入字典,供后续子节点匹配
        pathToIdMap[node.Path] = node.id;
    }
}

逻辑说明

  • 针对你给出的示例,使用方案1的常规目录匹配逻辑,id为45的节点父目录刚好是id1的路径,会自动把parentId设为1
  • 如果你的业务规则是只要路径前缀匹配就视为父子,替换为方案2的最长前缀匹配逻辑即可实现你提到的id55关联id45的效果
  • 代码自动兼容Windows、Linux不同系统的路径分隔符差异,无需手动处理斜杠方向

内容的提问来源于stack exchange,提问作者Clumpsypenguin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 13:30:02