如何创建嵌套分组:基于Parent集合生成指定多层分组结构
嵌套分组实现方案
要将IEnumerable<Parent>转换为IEnumerable<IGrouping<string, IGrouping<DateTime?, ChildClass>>>,可以通过Linq的SelectMany和多次GroupBy来实现,具体代码及步骤如下:
实现代码
// 假设你的Parent集合已经初始化 IEnumerable<Parent> parentCollection = // 你的数据源 var nestedGroupResult = parentCollection // 展平数据:关联每个ChildClass对应的EmployeeKey .SelectMany(parent => parent.ChildClassCollection, (parent, child) => new { parent.EmployeeKey, Child = child }) // 第一层分组:按EmployeeKey聚合同一员工的所有子项 .GroupBy(item => item.EmployeeKey) // 第二层嵌套分组:将每个员工的子项按SentData分组,再包装为目标类型的IGrouping .Select(employeeGroup => employeeGroup.GroupBy(item => item.Child.SentData) .GroupBy(subGroup => employeeGroup.Key, subGroup => subGroup) .First());
步骤拆解
- 展平数据:使用
SelectMany将每个Parent下的ChildClassCollection拆分为单独的子项,同时保留对应的EmployeeKey,得到一个包含员工标识和子项的扁平集合,为后续分组做准备。 - 按员工分组:通过
GroupBy(item => item.EmployeeKey)将同一员工的所有子项归为一组,得到IGrouping<string, {EmployeeKey, Child}>类型的集合。 - 嵌套按日期分组:对每个员工组内的子项,再次调用
GroupBy按SentData字段分组,得到按日期聚合的子组;最后将这些子组按员工Key重新分组并取第一个结果,就得到了IGrouping<string, IGrouping<DateTime?, ChildClass>>类型的嵌套分组,最终集合即为目标类型。
内容的提问来源于stack exchange,提问作者Kamran Shahid
相关产品推荐
相关产品推荐

