Как выполнить итерацию IGrouping <T> Interface?
Ive получил действительно раздражающую проблему, я сгруппировал набор данных, и я не могу добраться до данных внутри группы. Я могу добраться до ключа, а не от данных.
У меня есть груз данных, который находится в форме
Data.Period = x
Data.Adjustment = y
Я выполняю GroupBy
var groupedData = Data.GroupBy(x => x.Period new {x.Period});
Это возвращает (согласно linq) мои иерархические данные, которые начинают выглядеть так, как я хочу. Id нравится перебирать содержимое, но не могу... Как это сделать? и как я...
Работайте, как добраться до Data.Adjustment без использования проекции. И я не хочу проектировать еще, потому что мне нужно выполнить другую группировку.... помочь!: -)
Ответы
Ответ 1
Интерфейс IGrouping<TKey, TElement>
наследует IEnumerable<TElement>
:
foreach (var group in groupedData)
{
var groupKey = group.Key;
foreach (var groupedItem in group)
DoSomethingWith(groupKey, groupedItem);
}
Я отмечаю, что вам лучше использовать это для вашего запроса:
var groupedData = Data.GroupBy(x => x.Period);
вместо этого:
var groupedData = Data.GroupBy(x => new {x.Period});
Если, например, вы хотели бы усреднить настройки, вы можете сделать это:
foreach (var group in groupedData)
Console.WriteLine("Period: {0}; average adjustment: {1}", group.Key, group.Average(i => i.Adjustment));
Ответ 2
Каждый элемент последовательности IGrouping<TKey, TElement>
является IEnumerable<TElement>
, который вы можете перебирать для получения данных с общим TKey
:
var groups = Data.GroupBy(x => x.Period);
foreach(var group in groups) {
Console.WriteLine("Period: {0}", group.Key);
foreach(var item in group) {
Console.WriteLine("Adjustment: {0}", item.Adjustment);
}
}
Итак, в приведенном выше примере groups
является IEnumerable<IGrouping<TPeriod, TAdjustment>>
, где TPeriod
является типом Period
(вы не сказали нам), а TAdjustment
- тип Adjustment
. Затем group
- это объект, реализующий IEnumerable<TAdjustment>
(но он также имеет свойство Key
, чтобы вы могли получить ключ. Наконец, item
является TAdjustment
, а для каждого group
все item
, которые исходят из того, что group
имеют один и тот же ключ.
Ответ 3
Хотя это может быть очевидно для других, можно также использовать:
var groups = Data.GroupBy(x => x.Period);
foreach(var group in groups)
{
List<Data> dataListByPeriod = group.ToList();
//use this list
}
Ответ 4
Просто используйте foreach
:
foreach(var group in groupedData)
{
Console.WriteLine("Period: {0}", group.Key);
foreach(var item in group)
Console.WriteLine(" Adjustment: {0}", item.Adjustment);
}
Ответ 5
Вы также можете использовать следующий код.
var groupedData = Data.GroupBy(x => x.Period);
foreach (var group in groupedData) {
var gr = group.FirstOrDefault();
Console.WriteLine("Period: {0}", gr.Period);
Console.WriteLine("Adjustment: {0}", gr.Adjustment);
}