Синтаксис вложенной группы LINQ
MSDN действительно плохо справляется с объяснением вложенных групп в LINQ: https://docs.microsoft.com/en-us/dotnet/csharp/linq/create-a-nested-group
Возьмите этот пример:
IEnumerable<IGrouping<Gender, IGrouping<Job, Person>>> query =
from person in peopleList
group person by person.Gender into genderGroup
from jobGroup (
from person in genderGroup
group person by person.Job
)
group jobGroup by genderGroup.Key;
Мои вопросы:
- Почему в предложении from между круглыми скобками источником должна быть половая группа? Почему это не может быть просто из peopleList, как в первом предложении from?
- В последнем пункте, какое свойство jobGroup на самом деле просматривается, когда оно сравнивается с gengroup.Keys?
1 ответ
from person in genderGroup
group person by person.Job
Этот подзапрос повторяет людей одного пола, поэтому он группирует мужчин по их профессиям, а затем группирует женщин по их работе и так далее. Если peopleList
используется вместо genderGroup
, запрос будет просто группировать студента по должностям и не будет вложенной группировки.
group jobGroup by genderGroup.Key;
Это группирует внутренние группы, а не людей по ключу внешней группы (пол). Предположим, есть четыре jobGroup
мужчины программисты, мужчины дизайнеры, женщины программисты и женщины дизайнеры. Запрос группирует эти четыре группы по полу и, следовательно, создает вложенную группу:
male (outer group's key)
male programmers
male designers
female (outer group's key)
female programmers
female designers
Чтобы лучше понять, я рекомендую вам запустить этот небольшой код в Visual Studio и установить точки останова внутри оператора LINQ, чтобы увидеть, что происходит.