C# 在C语言中将平面数据转换成嵌套组的有效方法

C# 在C语言中将平面数据转换成嵌套组的有效方法,c#,performance,linq,nested,C#,Performance,Linq,Nested,我的任务是在C中将平面数据转换为双嵌套组 我完成了,但看起来很难看。我想知道是否有人能帮我指出如何使它更有效率。提前谢谢你 数据看起来不像是确切的数据和类: classFlatData = [{Class: Class1, Group: Group1, StudentName: Student1, StudentAge: 17}, {Class: Class1, Group: Group2, StudentName: Student2, StudentAge:

我的任务是在C中将平面数据转换为双嵌套组

我完成了,但看起来很难看。我想知道是否有人能帮我指出如何使它更有效率。提前谢谢你

数据看起来不像是确切的数据和类:

classFlatData = [{Class: Class1, Group: Group1, StudentName: Student1, StudentAge: 17},
                 {Class: Class1, Group: Group2, StudentName: Student2, StudentAge: 17}, 
                 {Class: Class2, Group: Group1, StudentName: Student3, StudentAge: 17},
                 {Class: Class2, Group: Group1, StudentName: Student4, StudentAge: 18}]
输出应该是这样的:

classData = [{Class:Class1, 
              ClassStudentCount:2, 
              Groups:[{Group:Group1, 
                       GroupStudentCount:1, 
                       Students:[{StudentName: Student1, StudentAge:17},
                      {Group:Group2, 
                       GroupStudentCount:1, 
                       Students:[{StudentName: Student2, StudentAge:17}]}
                       ]
              },
            {Class:Class2, 
              ClassStudentCount:2, 
              Groups:[{Group:Group1, 
                       GroupStudentCount:2, 
                       Students:[{StudentName: Student3, StudentAge:17},
                                 {StudentName: Student4, StudentAge:18}]}
                      ]
              }]
输出C类:

public class ClassModel
{
    public string Class {get;set}
    public int ClassStudentCount {get;set;}
    public List<GroupModel> Groups {get;set;}
}

public class GroupModel
{
   public string Class {get;set;}
   public string Group {get;set;}
   public int    GroupStudentCount {get;set;}
   public List<Student> Students {get;set}
}

public class StudentModel
{
   public string StudentName {get;set;}
   public int    StudentAge {get;set;}
}
我在想,有没有办法让它变成一个过程,而不是现在的两个部分

有没有一种方法可以减少循环次数,提高循环效率


非常感谢

简化了一点。您不需要按键筛选已分组的记录。此外,可以使聚合更为优化

var groupData= 从classFlatData中的d开始 d组由新的{d.类,d.组}组成 选择新的GroupModel { Class=group.Key.Class, Group=Group.Key.Group, GroupStudentCount=group.Count, 学生=团体 .Selects=>newstudentmodel { StudentName=s.StudentName, StudentAge=s.StudentAge } 托利斯先生 }; 变量类数据= 来自groupData中的g 按新{g.Class}将g分组到类中 选择新的类模型 { Class=classes.Key.Class, ClassStudentCount=classes.Sumx=>x.GroupStudentCount, Groups=classes.ToList };
对我来说,我认为分割这种逻辑是完全好的,甚至是被建议的,因为它可以提高可读性。否则,如果你在一个大问题中让人很难理解,其他团队成员会诅咒你。仅供参考,这类问题属于你。非常感谢你的帮助!我真的从你身上学到了很多!我只是在谷歌上搜索了如何接受答案,并在上面做了标记:再次感谢!
var groupData = from d in classFlatData
                group d by new {d.Class, d.Group} into group
                select new GroupModel
                {
                  Class = group.Key.Class,
                  Group = group.Key.Group,
                  GroupStudentCount = group.Count(),
                  Students = group.Where(g => g.Class == group.Key.Class && g.Group == group.Key.Group).Select(s => new StudentModel(){
                                            StudentName = s.StudentName,
                                            StudentAge = s.StudentAge
                                           }).ToList()
                 };

var classData = from g in groupData
                group g by new {g.Class} into classes
                select new ClassModel()
                {
                  Class = classes.Key.Class,
                  ClassStudentCount = classes.Where(g => g.Class == classes.Key.Class).Select(g => g.GroupStudentCount).ToList().Sum(),
                  Groups =  classes.Where( g => g.Class == classes.Key.Class).ToList()
                }