C#如何基于运行时可变表格数据动态创建分层Data对象
分层对象生成实现方案
输入示例数据
数据行列可在运行时动态增删,示例如下:
Column1 Column2 Column3 RED Car 100 RED Car 150 RED Bike 140 BLUE Car 240 BLUE Bike 120
给定实体类定义
public class Data{ public List<Data> ChildObjects; public string strName; }
生成规则
- 根对象strName固定为
parent,子节点为Column1列的所有去重值 - 每个Column1对应的节点下的子节点为Column2列的所有去重值
- 所有Column2对应的节点,子节点为Column3列的全部数值集合
实现代码
首先建议补充Data类的默认构造逻辑,避免空引用异常,核心实现如下:
// 优化后的实体类,自动初始化子对象集合 public class Data { public List<Data> ChildObjects { get; set; } = new List<Data>(); public string strName { get; set; } } /// <summary> /// 动态构建分层结构 /// </summary> /// <param name="rawData">解析后的原始数据行集合</param> /// <returns>分层结构根节点</returns> public Data BuildHierarchy(List<(string Column1, string Column2, int Column3)> rawData) { // 一次性提取所有需要的集合,避免重复遍历原始数据 HashSet<string> colorDistinct = rawData.Select(item => item.Column1).ToHashSet(); HashSet<string> typeDistinct = rawData.Select(item => item.Column2).ToHashSet(); List<string> allValues = rawData.Select(item => item.Column3.ToString()).ToList(); // 初始化根节点 Data root = new Data { strName = "parent" }; // 构建颜色层节点 foreach (string color in colorDistinct) { Data colorNode = new Data { strName = color }; root.ChildObjects.Add(colorNode); // 构建类型层节点 foreach (string type in typeDistinct) { Data typeNode = new Data { strName = type }; colorNode.ChildObjects.Add(typeNode); // 批量添加所有数值子节点 typeNode.ChildObjects.AddRange(allValues.Select(val => new Data { strName = val })); } } return root; }
逻辑说明
- 所有集合提前一次性计算,没有冗余遍历,性能最优
- 完全适配数据动态增删场景:新增的颜色、类型、数值会自动同步到最终结构中,不需要修改逻辑
- 严格符合要求的层级结构:每个类型节点下都包含全部Column3的数值,没有按颜色分组过滤
内容的提问来源于stack exchange,提问作者AAD
相关产品推荐
相关产品推荐

