如何在C#中按±5分的分数规则对学生列表进行分组?
学生分数分组逻辑实现(C#)
需求描述
需将学生按分数±5分的规则分组,同组内学生分数差值最大不超过5分。补充场景示例:当学生分数为4、8、12、16、20、24时,分组为:
- 4 & 8 → Group 1
- 12 & 16 → Group 2
- 20 & 24 → Group 3
初始代码
public class Students { public string Name {get; set;} public int Marks {get; set;} public int GroupID {get; set;} } public static void Main() { List<Students> students = new List<Students>(); students.Add(new Students { Name = "Aakash", Marks=89, GroupID=0 }); students.Add(new Students { Name = "Prakash", Marks=85, GroupID=0 }); students.Add(new Students { Name = "Ramesh", Marks=40, GroupID=0 }); students.Add(new Students { Name = "Neha", Marks=95, GroupID=0 }); students.Add(new Students { Name = "Suresh", Marks=93, GroupID=0 }); }
预期输出
GroupID 1: Aakash, Prakash Group 2: Ramesh GroupID 3: Neha, Suresh
实现代码
核心思路:先按分数对学生列表排序,从第一个学生开始,以当前学生分数为基准,将所有分数在基准±5范围内的学生归为一组,跳过已分组学生后重复此过程,直至所有学生完成分组。
using System; using System.Collections.Generic; using System.Linq; public class Students { public string Name { get; set; } public int Marks { get; set; } public int GroupID { get; set; } } public class Program { public static void Main() { List<Students> students = new List<Students> { new Students { Name = "Aakash", Marks = 89, GroupID = 0 }, new Students { Name = "Prakash", Marks = 85, GroupID = 0 }, new Students { Name = "Ramesh", Marks = 40, GroupID = 0 }, new Students { Name = "Neha", Marks = 95, GroupID = 0 }, new Students { Name = "Suresh", Marks = 93, GroupID = 0 } }; // 按分数升序排序,确保分组逻辑有序执行 var sortedStudents = students.OrderBy(s => s.Marks).ToList(); int currentGroupId = 1; int index = 0; while (index < sortedStudents.Count) { int baseMark = sortedStudents[index].Marks; // 筛选当前基准分数±5范围内的所有连续学生(因已排序,只需判断<=基准+5) var currentGroup = sortedStudents.Skip(index).TakeWhile(s => s.Marks <= baseMark + 5).ToList(); // 为组内学生分配GroupID foreach (var student in currentGroup) { student.GroupID = currentGroupId; } // 输出分组结果 Console.WriteLine($"GroupID {currentGroupId}:"); Console.WriteLine(string.Join(", ", currentGroup.Select(s => s.Name))); Console.WriteLine(); // 跳转至下一组起始位置 index += currentGroup.Count; currentGroupId++; } } }
代码说明
- 排序处理:先对学生列表按分数升序排序,保证后续分组时能连续筛选符合条件的学生。
- 分组判断:以当前组首个学生的分数为基准,向后筛选所有分数不超过基准+5的学生(因列表已排序,自动保证组内最小分数≥基准-5,满足差值≤5的要求)。
- 循环分组:完成一组后,跳过已分组学生,继续处理剩余学生,直至所有学生完成分组。
测试补充场景时,只需替换students列表为对应分数的学生数据,代码即可自动按要求完成分组。
内容的提问来源于stack exchange,提问作者KittyCat
相关产品推荐
相关产品推荐

