如何迭代IGrouping <t>接口?</t>

时间:2012-03-15 16:07:06

标签: c# linq

我有一个非常讨厌的问题我已经将一组数据分组,我无法获得该组内的数据。我可以得到关键位而不是数据..

我有大量数据,格式为

Data.Period = x
Data.Adjustment = y

我执行GroupBy

var groupedData = Data.GroupBy(x => x.Period new {x.Period});

这带回(根据linq)我的分层数据,它开始看起来我想要它。我喜欢迭代内容但不能......我该怎么做?我该怎么做......

了解如何在不使用投影的情况下访问Data.Adjustment。而且我不想投射,因为我必须执行另一个分组....帮助! : - )

5 个答案:

答案 0 :(得分:79)

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));

答案 1 :(得分:11)

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);
    }
}

因此,在上文中,groupsIEnumerable<IGrouping<TPeriod, TAdjustment>>,其中TPeriodPeriod的类型(您没有告诉我们),TAdjustmentAdjustment的类型。然后,group是实现IEnumerable<TAdjustment>的对象(但它也有Key属性,以便您可以获取密钥。最后,itemTAdjustment },并且对于每个group,来自迭代item的所有group都具有相同的密钥。

答案 2 :(得分:8)

只需使用foreach

foreach(var group in groupedData)
{
   Console.WriteLine("Period: {0}", group.Key);
   foreach(var item in group)
      Console.WriteLine("   Adjustment: {0}", item.Adjustment);
}

答案 3 :(得分:8)

虽然对其他人来说可能也很明显,但也可以使用:

var groups = Data.GroupBy(x => x.Period);

foreach(var group in groups)
{
   List<Data> dataListByPeriod = group.ToList();
   //use this list
}

答案 4 :(得分:2)

您也可以使用以下代码。

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);
}