2013-11-26 3 views
0

У меня есть IEnumerable<S> с S { T: a; IEnumerable<U> : b}, и я хотел бы сгруппировать его в IGrouping<T, U>, чтобы каждый ключ a был связан со всеми элементами U в любом b, который находится в том же S, что и этот ключ, из , (Это звучит очень сложно, но как только вы представляете себе операцию, которую я действительно хочу выполнять в вашей голове, она становится довольно ясной и, казалось бы, простой). Каков правильный способ сделать это? То, что я в настоящее время сделать этоGroupMany эквивалент

ienum.SelectMany(i => i.b.Select(b => new { i.a, b })) 
    .GroupBy(i => i.a, i => i.b); 

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

EDIT: В комментариях сказано, что a, b и i делают для довольно нечеткого чтения. Поэтому давайте сделаем это немного более конкретным. Допустим, S сейчас Office { Manager manager, IEnumerable<Employee> employees}. Это ставит вопрос: дай мне перегруппировку всех менеджеров своим сотрудникам. Это составляет эквивалентное заявление

offices.SelectMany(office => office.employees.Select(employee => new { office.manager, employee })) 
     .GroupBy(pair => pair.manager, pair => i.employee); 

Я не уверен, что это помогает. Для меня он читается еще более нечитаемым. Итак, все тот же вопрос, как сделать это более читаемым.

+0

Вы можете сделать его более читаемым, используя правильные имена переменных. 'i',' b' и 'a' не очень описательны. – Stijn

+0

Я сделаю редактирование на вопрос – Martijn

ответ

1

LINQ просто работает именно так. На самом деле нет другого способа заставить его работать, фактически не используя SelectMany и GroupBy.

Вы действительно должны быть рады, потому что я видел много запросов LINQ, которые были много раз более сложными и сложными для понимания. Для меня этот запрос все еще довольно прост и четко выражает намерение. И на самом деле легко следовать каждому шагу.