Как сделать перегрузку метода GroupBy чтобы вывести оценки для каждого студента
Дан класс Student:
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
public int Mark { get; set; }
public Student(string name, int age, int mark)
{
Name = name;
Age = age;
Mark = mark;
}
}
Реализуйте метод PrintStudentsMarks, который принимает коллекцию студентов (IEnumerable) students. Метод должен для каждого студента печатать список его оценок в формате:
Студент {Name} с возрастом {Age}: {Оценка1}, {Оценка2}, {Оценка3}.
Студент отличается от другого студента, если отличается имя или возраст. Если оба параметра совпадают, значит это один и тот же студент.
Не могу понять как вывести сплошным списком оценки для студента.
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
public int Mark { get; set; }
public Student(string name, int age, int mark)
{
Name = name;
Age = age;
Mark = mark;
}
}
public class Program
{
public static void Main()
{
List<Student> students = new List<Student>();
int counter = int.Parse(Console.ReadLine());
for (int i = 0; i < counter; i++)
{
var b1 = Console.ReadLine().Split();
string n = b1[0];
int n1 = int.Parse(b1[1]);
int n2 = int.Parse(b1[2]);
students.Add(new Student(n, n1, n2));
}
var distStudent = students.GroupBy(x => x.Name, y => y.Age, new StudentIEqualityComparer());
foreach (var student in distStudent)
{
var first = $"Студент {student.Name} с возрастом {student.Age}:";
foreach (var stud in groupStudent)
{
first += $" {stud.Key}";
}
Console.WriteLine($"{first}.");
}
}
}
}
public class StudentIEqualityComparer : IEqualityComparer<Student>
{
public bool Equals(Student x, Student y)
{
return x.Name == y.Name && x.Age == y.Age;
}
public int GetHashCode(Student obj)
{
return HashCode.Combine(obj.Name, obj.Age);
}
}
Сделал StudentIEqualityComparer который сравнивает имена по имени и возрасту, и не понимаю как его забросить в GroupBy, чтобы сработала перегрузка я смог отсортировать Учеников и вывести требуемый список с оценками. Подскажите что я делаю не так, как правильно реализовать решение
Пример правильного ввода и вывода:
7
Joseph 27 5
Vasya 20 1
Joseph 27 4
Joseph 27 5
Joseph 27 2
Vasya 20 1
Vasya 20 2
Sample Output:
Студент Joseph с возрастом 27: 5, 4, 5, 2.
Студент Vasya с возрастом 20: 1, 1, 2.
Ответы (1 шт):
var grouped = students.GroupBy(
x => x,
x => x.Mark,
new StudentIEqualityComparer()
);
foreach (var group in grouped)
{
var result = $"Студент {group.Key.Name} с возрастом {group.Key.Age}:";
foreach (var mark in group)
{
result += $" {mark}";
}
Console.WriteLine($"{result}.");
}
Так как компаратор принимает Student, то и первое выражение - keySelector - в методе GroupBy должно выдавать объект этого типа. Отсюда x => x - оставляем студента без изменений.
Второе выражение - elementSelector - принимает студента и выдаёт его оценку: x => x.Mark.
Ключом группы - group.Key - является Student. Поэтому просто используем его свойства.
В саму группу помещены оценки. Т. е. mark в цикле foreach имеет тип int.