group by 是linq中的分组功能,能通过给定的字段对数据集进行分组,得到分组后的结果。
基本用法
使用扩展函数GroupBy对数据集合通过给定的字段进行分组,新建一个基于.net6的控制台项目,在program.cs中写如下代码,通过班级将学生进行分组展示(顶级语句 ,从 C# 9 开始,无需在控制台应用程序项目中显式包含 Main
方法。 相反,可以使用顶级语句功能最大程度地减少必须编写的代码。 在这种情况下,编译器将为应用程序生成类和 Main
方法入口点。):
// See https://aka.ms/new-console-template for more information List<Student> students = new List<Student>() { new Student(){Name="1",Classroom="a"}, new Student(){Name="2",Classroom="a"}, new Student(){Name="3",Classroom="b"}, new Student(){Name="4",Classroom="b"} }; var groupStudents=students.GroupBy(student=>student.Classroom); foreach(var groupStudent in groupStudents) { Console.WriteLine(groupStudent.Key); foreach(var student in groupStudent) { Console.WriteLine($"{student.Name},{student.Classroom}"); } } public class Student { public string Name { get; set; } public string Classroom { get; set; } }
分组求和
统计某同学的总分,参考代码:
// See https://aka.ms/new-console-template for more information List<Student> students = new List<Student>() { new Student(){Name="小明",Classroom="a班",Subjects="数学",Score=100}, new Student(){Name="小彭",Classroom="a班",Subjects="数学",Score=100}, new Student(){Name="小明",Classroom="a班",Subjects="语文",Score=90}, new Student(){Name="小黄",Classroom="b班",Subjects="语文",Score=90} }; var groupStudents = from student in students group student by new { student.Name, student.Classroom } into res select new Student { Name = res.First().Name, Classroom = res.First().Classroom, Subjects = "已考科目总分", Score = res.Sum(x => x.Score), }; foreach (var groupStudent in groupStudents) { Console.WriteLine($"{groupStudent.Name},{groupStudent.Classroom},{groupStudent.Subjects},{groupStudent.Score}"); } public class Student { /// <summary> /// 姓名 /// </summary> public string Name { get; set; } /// <summary> /// 班级 /// </summary> public string Classroom { get; set; } /// <summary> /// 科目 /// </summary> public string Subjects { get; set; } /// <summary> /// 分数 /// </summary> public float Score { get; set; } }