使用LINQ重排JSON对象中父元素下的子元素
使用LINQ将扁平的groupFields数组转换为层级结构
嘿,我来帮你搞定这个用LINQ重排JSON数组结构的问题!咱们的目标是把扁平的groupFields数组,把子元素都归到对应的父元素下面,形成树形层级结构。下面分步骤给你讲解实现方法:
第一步:定义对应的实体类
首先得把JSON里的结构映射成C#实体,而且要加上子元素的集合属性,用来存放子节点:
public class GroupField { public int Id { get; set; } public string Name { get; set; } public int? ParentId { get; set; } public string ParentName { get; set; } // 新增子节点集合,用来存放子元素 public List<GroupField> Children { get; set; } = new List<GroupField>(); }
第二步:用LINQ+字典实现高效转换
这种方法效率很高,因为用字典做O(1)的父元素查找,避免多次遍历数组:
// 先把你的JSON反序列化成扁平的GroupField列表 var flatGroupFields = JsonConvert.DeserializeObject<List<GroupField>>(yourJsonString); // 创建ID到GroupField的字典,方便快速定位父元素 var groupDict = flatGroupFields.ToDictionary(g => g.Id); // 遍历每个元素,将其添加到对应父元素的子集合中 foreach (var group in flatGroupFields) { if (group.ParentId.HasValue && groupDict.ContainsKey(group.ParentId.Value)) { groupDict[group.ParentId.Value].Children.Add(group); } } // 最后筛选出所有根节点(ParentId为null的元素),就是我们要的层级结构 var hierarchicalGroups = flatGroupFields.Where(g => !g.ParentId.HasValue).ToList();
可选:纯LINQ递归实现(不修改原始数据)
如果你不想修改原始的扁平数据,想要创建新的层级对象,可以用递归的LINQ查询:
// 先反序列化得到扁平列表 var flatGroupFields = JsonConvert.DeserializeObject<List<GroupField>>(yourJsonString); // 定义递归委托来构建层级 Func<int?, List<GroupField>> buildHierarchy = null; buildHierarchy = parentId => flatGroupFields .Where(g => g.ParentId == parentId) .Select(g => new GroupField { Id = g.Id, Name = g.Name, ParentId = g.ParentId, ParentName = g.ParentName, Children = buildHierarchy(g.Id) // 递归构建子节点 }) .ToList(); // 传入null获取所有根节点 var hierarchicalGroups = buildHierarchy(null);
两种方式各有优势:第一种方式直接修改原始对象的子集合,性能更好;第二种方式生成新的对象,不会影响原始数据,适合需要保留原始扁平结构的场景。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

