Изучая LINQ-запросы, надумал себе следующую задачку: "Необходимо написать программу, которая будет группировать студентов по их возрасту, а потом выводить список полученных групп и студентов в них. Вывод должен представлять собой нечто следующее:
19 : Вася, Петя, Саша
21 : Миша
Пишу следующий код:
class Program
{
static void Main(string[] args)
{
Student[] array = {
new Student("Vasya","Pupkin",20),
new Student("Sanya","Ponomarev",21),
new Student("Alexey","Mechkin",20),
new Student("Vitya","Pupkin",19),
new Student("Bashmak","Fedochenko",23)};
var groupsByAge = from ageGroup in array
group ageGroup by ageGroup.Age;
foreach (var group in groupsByAge) Console.WriteLine($"Group is
{group}");
}
}
И класс Student
class Student
{
public string Name { get; private set; }
public string Surname { get; private set; }
public int Age { get; private set; }
public Student(string name, string surname, int age)
{
Name = name;
Surname = surname;
Age = age;
}
}
Когда произвожу вывод даже на данном этапе написания кода, результат следующий:
Group is System.Linq.Lookup`2+Grouping[System.Int32,SecondTestProject.Student]
Group is System.Linq.Lookup`2+Grouping[System.Int32,SecondTestProject.Student]
Group is System.Linq.Lookup`2+Grouping[System.Int32,SecondTestProject.Student]
Group is System.Linq.Lookup`2+Grouping[System.Int32,SecondTestProject.Student]
Хочется верить, что причину вывода такого результата я понимаю. В цикле foreach, полагаю, я вывожу что то вроде адресов этих групп (ситуация на подобии если бы я хотел вывести ссылку на объект). Однако как выполнить задачу я не знаю. Необходимо что бы цикл(ы) foreach выводили сначала группу, потом студентов которые в неё входят, а затем следующую группу.
Насколько я понимаю, запрос я сформировал правильно, но вывод произвел неверно. Как правильно выполнить запрос и вывести результаты в необходимом мне виде?
Поскольку group
- это коллекция, то для для "склеивания" значений этой коллекции необходимо осуществить её перебор. Сделать это можно разными способами, например - Aggregate
:
Console.WriteLine($"{group.Key}: {group.Aggregate(string.Empty, (current, k) => $"{current}{(string.IsNullOrEmpty(current) ? string.Empty : ", ")}{k.Name}")}");
Так же можно добавить сортировку:
var groupsByAge = from ageGroup in array
orderby ageGroup.Age
group ageGroup by ageGroup.Age;
19: Vitya
20: Vasya, Alexey
21: Sanya
23: Bashmak
Console.WriteLine($"{group.Key} : {string.Join(", ", group.Select(s => s.Name))}");
Так же я рекомендую юзать LINQ через экстеншены:
var groupsByAge = array.GroupBy(s => s.Age);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Как можно вывести список сетей, уровень их сигнала, и подключиться к сети через netsh c#?
Разрабатывал проект на WPF с использованием MaterialDesignInXamlToolkit, потом понял что необходимо иметь кроссплатформенность для данного проектаУзнал...
WorkingClass - статический класс,в который вложен класс member,в который вложен массив List экземпляров класса LoanWorkingClass