У меня есть вопрос IGrouping
и о Select()
методе.
Допустим, у меня есть IEnumerable<IGrouping<int, smth>>
таким образом:
var groups = list.GroupBy(x => x.ID);
где list
это List<smth>
.
И теперь мне нужно IGrouping
каким-то образом передать значения каждого в другой список:
foreach (var v in structure)
{
v.ListOfSmth = groups.Select(...); // <- ???
}
Кто-нибудь может подсказать, как получить значения ( List<smth>
) из IGrouping<int, smth>
в таком контексте?
Ответы:
Поскольку
IGrouping<TKey, TElement>
реализуетIEnumerable<TElement>
, вы можете использовать,SelectMany
чтобы собрать всеIEnumerables
обратно в одинIEnumerable
все вместе:источник
groups
и вернуться к единому списку.OrderBy(x => x.id)
отсортирует их в порядке возрастания по идентификатору. Сравните это с тем.GroupBy(x => x.id).SelectMany(group => group)
, что отсортирует их по порядку первого появления идентификатора. Если исходные идентификаторы имеют следующий порядок: [1,3,2,2,2,3,0], то при группировании их и сведении в один список идентификаторы будут размещены в новом порядке: [1,3,3, 2,2,2,0].Сначала нужно выбрать нужную группу. Тогда вы можете использовать
ToList
метод группы.IGrouping
ЯвляетсяIEnumerable
значений.источник
Более уточненная версия приведенных выше ответов:
источник
Из определения IGrouping:
Вы можете просто перебрать элементы вроде этого:
источник