Как получить значения из IGrouping
У меня вопрос о методах 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>
в таком контексте?
Ответы
Ответ 1
Так как 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();
Ответ 2
foreach (var v in structure)
{
var group = groups.Single(g => g.Key == v. ??? );
v.ListOfSmth = group.ToList();
}
Сначала вам нужно выбрать нужную группу. Затем вы можете использовать метод ToList
в группе. IGrouping
- это IEnumerable
значений.
Ответ 3
Из определения 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
}
Ответ 4
Более подробная версия приведенных выше ответов:
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;
}
}
Ответ 5
Вы также можете использовать следующий код.
var groupedData = Data.GroupBy(x => x.Period).Select(x => x).ToList();
foreach (var group in groupedData) {
var gr = group.FirstOrDefault();
Console.WriteLine("Period: {0}", gr.Period);
Console.WriteLine("Adjustment: {0}", gr.Adjustment);
}