【问题标题】:How do I iterate an IGrouping<T> Interface?如何迭代 IGrouping<T> 接口?
【发布时间】:2019-02-04 22:33:04
【问题描述】:

我遇到了非常烦人的问题,我已经对一组数据进行了分组,但我无法访问组内的数据。我可以得到关键位而不是数据..

我有大量表格中的数据

Data.Period = x
Data.Adjustment = y

我执行 GroupBy

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

这会带回(根据 linq)我的分层数据,这些数据开始看起来像我想要的那样。我想遍历内容但不能......我该怎么做?以及我该如何...

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

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    IGrouping&lt;TKey, TElement&gt;接口继承IEnumerable&lt;TElement&gt;

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

    【讨论】:

    • 您好,如何在您的代码的最后一个 foreach 语句中对组执行查询?如何将其转换为 n Igroup?
    • @Exitos 您不需要将其转换为IGroup;它已经一个IGroup。有关示例,请参见编辑后的答案。
    • 那么在您的第一个 foreach 语句之后如何查询该组?谢谢顺便说一句
    • 等一下,我知道了,我只用了一个 lamda 就可以了!谢谢!
    • @Exitos 我添加的示例显示了如何查询组以获取其成员Adjustment 属性的平均值。如果您描述了您想要执行的查询类型,我将发布一个更接近您的要求的示例。
    【解决方案2】:

    IGrouping&lt;TKey, TElement&gt; 序列中的每个元素都是一个 IEnumerable&lt;TElement&gt;,您可以对其进行迭代以获取具有共同 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&lt;IGrouping&lt;TPeriod, TAdjustment&gt;&gt;,其中TPeriodPeriod 的类型(你没有告诉我们),TAdjustmentAdjustment 的类型。那么,group 是一个实现了IEnumerable&lt;TAdjustment&gt; 的对象(但它也有一个Key 属性,以便您可以获取密钥。最后,item 是一个TAdjustment,并且对于每个group,所有来自 group 的迭代的 item 具有相同的键。

    【讨论】:

      【解决方案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);
          }
          

          【讨论】:

            猜你喜欢
            • 2013-10-31
            • 1970-01-01
            • 1970-01-01
            • 2013-02-28
            • 2017-08-11
            • 2018-04-14
            • 2010-11-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多