C# Linq с более чем двумя вложенными уровнями - PullRequest
1 голос
/ 29 апреля 2020

Я видел несколько примеров вложенных групп, например, Студенты , где студенты группируются сначала по годам, а затем по фамилии:

var queryNestedGroups =
    from student in students
    group student by student.Year into newGroup1
    from newGroup2 in
        (from student in newGroup1
         group student by student.LastName)
    group newGroup2 by newGroup1.Key;

, а затем они перебирают циклы для извлечения значения

 foreach (var outerGroup in queryNestedGroups)
{
    Console.WriteLine($"DataClass.Student Level = {outerGroup.Key}");
    foreach (var innerGroup in outerGroup)
    {
        Console.WriteLine($"\tNames that begin with: {innerGroup.Key}");
        foreach (var innerGroupElement in innerGroup)
        {
            Console.WriteLine($"\t\t{innerGroupElement.LastName} {innerGroupElement.FirstName}");
        }
    }
}

Я понимаю, как это работает до сих пор, но в моем случае мне нужно добавить дополнительную группировку, допустим, по FirstName. Я пробовал что-то вроде ниже, но безрезультатно. Можно ли посоветовать, пожалуйста?

var queryNestedGroups =
from student in students
group student by student.Year into newGroup1
from newGroup2 in
    (from student in newGroup1
     group student by student.LastName)
from newGroup3 in
(from student in newGroup2
 group student by student.FirstName)
group newGroup3 by newGroup2.Key;

Я также пытался поместить третью вложенную группу во вторую, но тогда я даже не могу построить проект. Любая помощь будет высоко ценится.

1 Ответ

3 голосов
/ 29 апреля 2020

Я бы предпочел использовать вложение анонимных типов:

from student in students
group student by student.Year into g1
select new
{
    Year = g1.Key,
    Students =
        from student in g1
        group student by student.LastName into g2
        select new
        {
            LastName = g2.Key,
            Students =
                from student in g2
                group student by student.FirstName into g3
                select new
                {
                    FirstName = g3.Key,
                    Students = g3
                }
        }
}

Это может выглядеть немного более многословно, но оно понятно, легко расширяется и не требует неудобного и ошибочного склонные к повторению группировки ключей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...