LINQ-запросы. Использование оператора group

177
01 октября 2018, 22:40

Изучая 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 выводили сначала группу, потом студентов которые в неё входят, а затем следующую группу.

Насколько я понимаю, запрос я сформировал правильно, но вывод произвел неверно. Как правильно выполнить запрос и вывести результаты в необходимом мне виде?

Answer 1

Поскольку 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

Answer 2
Console.WriteLine($"{group.Key} : {string.Join(", ", group.Select(s => s.Name))}");

Так же я рекомендую юзать LINQ через экстеншены:

var groupsByAge = array.GroupBy(s => s.Age);
READ ALSO
ошибка при импорте метода OpenGL

ошибка при импорте метода OpenGL

при импорте метода glCopyBufferSubData выдаёт ошибку

176
Подключение к wifi через netsh c#

Подключение к wifi через netsh c#

Как можно вывести список сетей, уровень их сигнала, и подключиться к сети через netsh c#?

168
Возможно ли соединить AvaloniaUI с MaterialDesignInXamlToolkit?

Возможно ли соединить AvaloniaUI с MaterialDesignInXamlToolkit?

Разрабатывал проект на WPF с использованием MaterialDesignInXamlToolkit, потом понял что необходимо иметь кроссплатформенность для данного проектаУзнал...

156
Почему следующий код возвращает ошибку

Почему следующий код возвращает ошибку

WorkingClass - статический класс,в который вложен класс member,в который вложен массив List экземпляров класса LoanWorkingClass

156