You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将双重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;
    }
}

和原代码的对比优势

  1. 性能提升:原代码是嵌套循环,每个讲师都要遍历所有学生;优化后只需要遍历一次学生列表分组,再遍历一次讲师列表,时间复杂度从O(n*m)降到O(n+m)。
  2. 可读性更强:代码逻辑分层清晰,一眼就能看出是先分组统计学生,再关联讲师计算学分,不需要在嵌套循环里找条件判断。
  3. 代码更简洁:去掉了冗余的嵌套循环和重复的条件判断,用LINQ操作替代,行数更少。

内容的提问来源于stack exchange,提问作者last of us fan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:03:21