LINQ中的多重嵌套分组

4
假设,举例来说,在我的C#代码中,我定义了一个名为MyClass的类:
public class MyClass
{
    public string GroupName;
    public DateTime Dt;
    .... other properties ....
}

假设我有以下的List<MyClass>(将其显示为表格似乎是最简单描述其内容的方法):

GroupName:       Dt:             Val:
Group1           2016/01/01      a
Group1           2016/01/02      b
Group1           2016/01/03      c
Group2           2016/01/01      d
Group2           2016/01/02      e
Group3           2016/01/01      f
Group3           2016/01/02      g
Group3           2016/01/03      h

我希望从这个列表中获取所有数据:

  1. 首先按Dt分组
  2. 其次按GroupName分组

因此,(我确信这是错误的,但我希望它能解释我正在寻找什么),我想获得一个IEnumerable<IGrouping<DateTime,IEnumerable<IGrouping<string,IEnumerable<MyClass>>>>

我最好的尝试是以下内容:

return MyList
    .GroupBy(d => d.Dt)
    .GroupBy(grp => grp.ToList().GroupBy(d => d.GroupName));

我知道这是错误的,但这是我能想到的唯一解决方法。 我应该如何得到我需要的东西?

1个回答

11

使用Select

return MyList
    .GroupBy(d => d.Dt)
    .Select(grp => grp.GroupBy(d => d.GroupName));
为了得到您想要的精确结果,您需要在Select之后添加一个额外的GroupBy
var groups = MyList
    .GroupBy(d => d.Dt)
    .Select(grp => new { key = grp.Key, items = grp.GroupBy(d => d.GroupName) })
    .GroupBy(grp => grp.key, grp => grp.items);

在这里输入图片描述


谢谢,@Marcin,但我仍然无法返回一个group<group<results>>作为一组,我可以先迭代Dts,然后再迭代Groupnames - 您的解决方案是否可以实现这一点? - John Bustos
3
这是一个嵌套的分组,以下是更具体的版本,您可以在其中使用 . 查看发生了什么:返回 MyList .GroupBy(d => d.Dt) .Select(g1 => new { Dt = g1.Key, Dts = g1.GroupBy(d => d.GroupName) .Select(g2 => new { GroupName = g2.Key, GroupNames = g2 }) }); - gzak
@MarcinJuraszek,随意将编辑后的版本粘贴到你的回答中。 - gzak
@JohnBustos 我更新了我的答案,并提供了一个查询,可以给你想要的结果。 - MarcinJuraszek
非常感谢Marcin和@gzak - 这真的不是我自己能想出来的,而且完美地解决了我的问题!!!- 谢谢你们 - John Bustos
@gzak的评论正是我所需要的(无需遍历额外的组级别),谢谢! - CodeThief

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接