Подтвердить что ты не робот

Как выполнить итерацию 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 без использования проекции. И я не хочу проектировать еще, потому что мне нужно выполнить другую группировку.... помочь!: -)

4b9b3361

Ответ 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);
}