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

如何在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++;
        }
    }
}

代码说明

  1. 排序处理:先对学生列表按分数升序排序,保证后续分组时能连续筛选符合条件的学生。
  2. 分组判断:以当前组首个学生的分数为基准,向后筛选所有分数不超过基准+5的学生(因列表已排序,自动保证组内最小分数≥基准-5,满足差值≤5的要求)。
  3. 循环分组:完成一组后,跳过已分组学生,继续处理剩余学生,直至所有学生完成分组。

测试补充场景时,只需替换students列表为对应分数的学生数据,代码即可自动按要求完成分组。

内容的提问来源于stack exchange,提问作者KittyCat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 07:24:22