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

从列表合并数据集层级:自引用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:47:04