首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >分组成绩相似的学生(5分上下)

分组成绩相似的学生(5分上下)
EN

Stack Overflow用户
提问于 2022-08-20 07:32:32
回答 1查看 91关注 0票数 0

我想把同样分数的学生分成5分上下的学生。

代码语言:javascript
运行
复制
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 });
}

预期输出:

代码语言:javascript
运行
复制
GroupID 1:
Aakash, Prakash

Group 2:
Ramesh
    
GroupID 3:
Neha, Suresh

如果学生的成绩分别为4,8,12,16,20和24,会发生什么?

他们将被分成不同的组,以便每一组在最大范围内有5点的差异:

  • 4和8在1组
  • 12和16在2组
  • 20和24在第3组。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-20 08:08:07

如果您想根据组中最高的分数来确定每个组的分数范围,您可以这样写:

代码语言:javascript
运行
复制
var ordered = students.OrderByDescending(s => s.Marks).ToList();
int groupId = 0;
int nextIndex = 0;
while (nextIndex < ordered.Count)
{
    groupId++;
    var firstInGroup = ordered[nextIndex];
    var group = ordered.Skip(nextIndex).
                        TakeWhile(s => firstInGroup.Marks - s.Marks <= 5).ToList();
    group.ForEach(s => s.GroupID = groupId);
    nextIndex += group.Count;
}

为了使它可重用,并允许在两个方向上进行分组,您可以将其转换为一个助手方法,如下所示:

代码语言:javascript
运行
复制
enum MarkGroupingOption { HighestToLowest, LowestToHighest }

static void SetGroupIds(List<Students> students, int marksThreshold, 
                        MarkGroupingOption groupingOption)
{
    var ordered = (groupingOption == MarkGroupingOption.HighestToLowest
        ? students.OrderByDescending(s => s.Marks).ToList()
        : students.OrderBy(s => s.Marks).ToList());

    int groupId = 0;
    int nextIndex = 0;
    while (nextIndex < ordered.Count)
    {
        groupId++;
        var firstInGroup = ordered[nextIndex];
        var remaining = ordered.Skip(nextIndex);
        var group = (groupingOption == MarkGroupingOption.HighestToLowest
            ? remaining.TakeWhile(s => firstInGroup.Marks - s.Marks <= marksThreshold)
            : remaining.TakeWhile(s => s.Marks - firstInGroup.Marks <= marksThreshold)
            ).ToList();
        group.ForEach(s => s.GroupID = groupId);
        nextIndex += group.Count;
    }
}

使用:

代码语言:javascript
运行
复制
SetGroupIds(students, 5, MarkGroupingOption.HighestToLowest);

SetGroupIds(students, 5, MarkGroupingOption.LowestToHighest);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73424871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档