我想把同样分数的学生分成5分上下的学生。
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
如果学生的成绩分别为4,8,12,16,20和24,会发生什么?
他们将被分成不同的组,以便每一组在最大范围内有5点的差异:
发布于 2022-08-20 08:08:07
如果您想根据组中最高的分数来确定每个组的分数范围,您可以这样写:
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;
}
为了使它可重用,并允许在两个方向上进行分组,您可以将其转换为一个助手方法,如下所示:
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;
}
}
使用:
SetGroupIds(students, 5, MarkGroupingOption.HighestToLowest);
SetGroupIds(students, 5, MarkGroupingOption.LowestToHighest);
https://stackoverflow.com/questions/73424871
复制相似问题