如何迭代IGrouping<;T>;界面

本文关键字:lt gt 界面 IGrouping 何迭代 迭代 | 更新日期: 2023-09-27 18:28:00

我遇到了一个非常烦人的问题,我对一组数据进行了分组,但无法访问组中的数据。我能找到关键点而不是数据。。

我有一堆形式的数据

Data.Period = x
Data.Adjustment = y

我执行GroupBy

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

这带回了(根据linq)我的分层数据,它开始看起来像我想要的那样。我想迭代内容,但不能。。。我该怎么做?以及我如何…

了解如何获取数据。在不使用投影的情况下进行调整。我还不想投影,因为我必须执行另一个分组。。。。救命!:-)

如何迭代IGrouping<;T>;界面

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

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属性,这样你就可以获得密钥。最后,item是一个TAdjustment,对于每个group,迭代该group得到的所有item都有相同的密钥。

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

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

只需使用foreach:

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

您也可以使用以下代码。

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