如何将双重foreach的讲师工作量统计代码转为C# Lambda表达式?
用Lambda+LINQ简化讲师工作量统计代码
当然可以!用Lambda结合LINQ不仅能简化你的嵌套循环代码,还能让逻辑更清晰,甚至大幅提升性能——毕竟原代码的嵌套循环时间复杂度是O(n*m),优化后能降到O(n+m),数据量大的时候差别会很明显。
先拆解下你原代码的核心逻辑:遍历每个讲师,再逐个检查学生是否属于该讲师的对应模块,每匹配到一个学生,就给讲师的学分加上该模块的学分值。本质上就是统计每个讲师对应模块的学生数量,再用学生数量×模块学分值,最终累加到讲师的总学分里。
优化方案1:先分组学生,再关联讲师(推荐,性能更优)
这个方案先把学生按「讲师姓名+模块名」分组并统计数量,再遍历讲师列表匹配分组数据,计算总学分:
public void GetLecturersWorkloadStatistics(List<Student> studentList, List<Lecturer> lecturerList) { // 第一步:将学生按讲师姓名、姓氏、模块名分组,统计每组的学生数量 var studentGroupCount = studentList .GroupBy(student => new { student.LecturerFirstName, student.LecturerLastName, student.ModuleName }) .ToDictionary(group => group.Key, group => group.Count()); // 第二步:用Lambda的ForEach遍历讲师列表,更新学分 lecturerList.ForEach(lecturer => { // 构造和分组一致的匹配键 var matchKey = new { LecturerFirstName = lecturer.FirstName, LecturerLastName = lecturer.LastName, ModuleName = lecturer.ModuleName }; // 如果找到匹配的学生分组,计算并累加学分 if (studentGroupCount.TryGetValue(matchKey, out int studentNumber)) { lecturer.Credits += lecturer.ModuleValueInCredits * studentNumber; } }); }
优化方案2:用Join关联讲师和学生后分组
如果你更习惯用LINQ的链式调用,也可以通过Join操作直接关联讲师和匹配的学生,再分组计算:
public void GetLecturersWorkloadStatistics(List<Student> studentList, List<Lecturer> lecturerList) { // 关联讲师和匹配的学生,按讲师分组后计算总学分 var workloadStats = lecturerList .Join(studentList, // 讲师的匹配键 lecturer => new { lecturer.FirstName, lecturer.LastName, lecturer.ModuleName }, // 学生的匹配键 student => new { student.LecturerFirstName, student.LecturerLastName, student.ModuleName }, // 关联后返回的对象 (lecturer, student) => new { Lecturer = lecturer }) .GroupBy(item => item.Lecturer) .Select(group => new { Lecturer = group.Key, TotalAddCredits = group.Key.ModuleValueInCredits * group.Count() }); // 更新每个讲师的学分 foreach (var stat in workloadStats) { stat.Lecturer.Credits += stat.TotalAddCredits; } }
和原代码的对比优势
- 性能提升:原代码是嵌套循环,每个讲师都要遍历所有学生;优化后只需要遍历一次学生列表分组,再遍历一次讲师列表,时间复杂度从O(n*m)降到O(n+m)。
- 可读性更强:代码逻辑分层清晰,一眼就能看出是先分组统计学生,再关联讲师计算学分,不需要在嵌套循环里找条件判断。
- 代码更简洁:去掉了冗余的嵌套循环和重复的条件判断,用LINQ操作替代,行数更少。
内容的提问来源于stack exchange,提问作者last of us fan
相关产品推荐
相关产品推荐

