C# 如何基于文件夹路径为RazorTree列表节点映射赋值parentId
实现思路
核心逻辑是通过路径的层级关系匹配父子节点,步骤如下:
- 先统一标准化所有节点的路径格式,消除末尾斜杠、大小写差异带来的匹配问题
- 按路径层级从浅到深排序节点,保证处理子节点时父节点已经完成录入
- 遍历节点时匹配对应父路径,完成
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
相关产品推荐
相关产品推荐

