从列表合并数据集层级:自引用ItemSet类的实现问询
没问题!我来帮你实现这个从扁平列表合并成嵌套ItemSet层级的功能。先给你梳理下思路,再上代码~
实现从列表合并ItemSet层级结构的方案
首先,先修正下你提供的ItemSet类的小细节——原来的代码里ItemSets没有初始化,而且Add方法的参数名缺失,容易导致空引用异常。我先调整成更健壮的版本:
public class ItemSet { public string Name { get; set; } public List<ItemSet> ItemSets { get; set; } // 构造函数初始化子集合,避免后续操作空引用 public ItemSet(string name) { Name = name; ItemSets = new List<ItemSet>(); } public void Add(ItemSet itemSet) { ItemSets.Add(itemSet); } }
接下来核心的合并逻辑:我们需要把扁平的层级路径(比如"A/B/C"这种格式)转换成嵌套的ItemSet结构。思路是遍历每个路径,拆分成分段后逐层查找或创建节点,最终构建出完整的层级树。
这里写一个静态工具类来实现这个功能,支持自定义分隔符:
public static class ItemSetMerger { public static List<ItemSet> MergeFromPaths(List<string> paths, char separator = '/') { var rootItemSets = new List<ItemSet>(); foreach (var path in paths) { // 拆分路径为层级段,移除空项(处理首尾可能的分隔符) var segments = path.Split(separator, StringSplitOptions.RemoveEmptyEntries); if (segments.Length == 0) continue; // 从根层级开始遍历 List<ItemSet> currentLevel = rootItemSets; foreach (var segment in segments) { // 检查当前层级是否已存在同名的ItemSet var existingItem = currentLevel.FirstOrDefault(i => i.Name.Equals(segment, StringComparison.OrdinalIgnoreCase)); if (existingItem == null) { // 不存在则创建新节点并加入当前层级 existingItem = new ItemSet(segment); currentLevel.Add(existingItem); } // 移动到下一层级继续处理 currentLevel = existingItem.ItemSets; } } return rootItemSets; } }
测试使用示例
比如我们有这样的路径列表:
var testPaths = new List<string> { "Electronics/Phones/Smartphones", "Electronics/Phones/Feature Phones", "Electronics/Laptops/Ultrabooks", "Home/Appliances/Washers", "Home/Appliances/Dryers" }; // 合并生成层级结构 var mergedResult = ItemSetMerger.MergeFromPaths(testPaths);
为了验证结果,我们可以写个递归方法打印整个结构:
void PrintHierarchy(ItemSet item, int indentLevel = 0) { Console.WriteLine($"{new string(' ', indentLevel * 2)}- {item.Name}"); foreach (var child in item.ItemSets) { PrintHierarchy(child, indentLevel + 1); } } foreach (var root in mergedResult) { PrintHierarchy(root); }
打印输出会是:
- Electronics - Phones - Smartphones - Feature Phones - Laptops - Ultrabooks - Home - Appliances - Washers - Dryers
关键说明
- 构造函数初始化
ItemSets:避免后续调用Add时出现NullReferenceException - 忽略空分段:用
StringSplitOptions.RemoveEmptyEntries处理路径首尾可能的分隔符 - 不区分大小写匹配(可选):如果需要严格区分大小写,去掉
StringComparison.OrdinalIgnoreCase即可 - 自定义分隔符:默认用
/,你可以根据需求传入其他分隔符(比如\或者.)
内容的提问来源于stack exchange,提问作者LCaraway
相关产品推荐
相关产品推荐

