Как получить значения из IGrouping
у меня есть вопрос о IGrouping и Select() метод.
допустим, у меня есть IEnumerable<IGrouping<int, smth>>
таким образом:
var groups = list.GroupBy(x => x.ID);
где список-это List<smth>
.
и теперь мне нужно передать значения каждого IGrouping
в другой список каким-то образом.:
foreach (var v in structure)
{
v.ListOfSmth = groups.Select(...); // <- ???
}
может ли кто-нибудь предложить, как получить значения (List<smth>
) от IGrouping<int, smth>
в таком контексте?
4 ответов
С IGrouping<TKey, TElement>
осуществляет IEnumerable<TElement>
, вы можете использовать SelectMany
поставить все IEnumerables
обратно в IEnumerable
все вместе:
List<smth> list = new List<smth>();
IEnumerable<IGrouping<int, smth>> groups = list.GroupBy(x => x.id);
IEnumerable<smth> smths = groups.SelectMany(group => group);
List<smth> newList = smths.ToList();
foreach (var v in structure)
{
var group = groups.Single(g => g.Key == v. ??? );
v.ListOfSmth = group.ToList();
}
сначала вам нужно выбрать нужную группу. Тогда вы можете использовать ToList
метод on группы. The IGrouping
это IEnumerable
значений.
из определения IGrouping :
IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable
вы можете просто перебирать такие элементы:
IEnumerable<IGrouping<int, smth>> groups = list.GroupBy(x => x.ID)
foreach(IEnumerable<smth> element in groups)
{
//do something
}
более уточненная версия ответов выше:
IEnumerable<IGrouping<int, ClassA>> groups = list.GroupBy(x => x.PropertyIntOfClassA);
foreach (var groupingByClassA in groups)
{
int propertyIntOfClassA = groupingByClassA.Key;
//iterating through values
foreach (var classA in groupingByClassA)
{
int key = classA.PropertyIntOfClassA;
}
}