C#中的嵌套GroupBy

问题描述 投票:1回答:2

拥有这种结构的对象:

public class GroupedObject
{
    public int id { get; set; }
    public string name { get; set; }
    public int value { get; set; }
    public string color { get; set; }
}

在这里,它按其属性之一id分组。

var myObj = someResponse
    .Select(d => new GroupedObject
    {
        id = d.id,
        name = d.name,
        value = d.value,
        color = d.color
    })
    .GroupBy(o => o.id)
    .ToDictionary(a => a.Key, a => a.Select(o => o).ToList());

结构是:

id - id, name, value, color
id - id, name, value, color
id - id, name, value, color

我想要做的是再次通过name对其进行分组,以获得如下的嵌套结构:

id - name - id, name, value, color
   - name - id, name, value, color
id - name - id, name, value, color
   - name - id, name, value, color 
   - name - id, name, value, color 
   - name - id, name, value, color 
id - name - id, name, value, color
   - name - id, name, value, color 
   - name - id, name, value, color 

试图两次使用GroupBy不起作用。既不是用ToList转换它,也不是在那之后进行分组。

 var myObj = someResponse
        .Select(d => new GroupedObject
        {
            id = d.id,
            name = d.name,
            value = d.value,
            color = d.color
        })
        .GroupBy(o => o.id).GroupBy(o => o.name)
        .ToDictionary(a => a.Key, a => a.Select(o => o).ToList());
c# dictionary group-by tolist todictionary
2个回答
1
投票

你是在正确的轨道上,但是这里是LINQ实现两个嵌套级别的分组:

someResponse
    .Select(d => new GroupedObject
    { 
        id = d.id,
        name = d.name,
        value = d.value,
        color = d.color
    })
    .GroupBy(o => o.id)
    .ToDictionary(
        a => a.Key,
        a => a.GroupBy(o => o.name).ToDictionary(o => o.Key, o => o));

这将导致类型为:Dictionary<int, Dictionary<string, IGrouping<string, GroupedObject>>>的对象

考虑到这一点,最后的IGrouping<string, GroupedObject>类型可以更改/投影到不同的类型,在嵌套的ToDictionary调用中指定合适的lamda:

例如用ToDictionary(o => o.Key, o => o.ToList())改变对Dictionary<int, Dictionary<string, List<GroupedObject>>>的调用结果


0
投票

使用理解语法可能更容易:

var myObj = from sr in someResponse
    .Select(d => new GroupedObject
    {
        id = d.id,
        name = d.name,
        value = d.value,
        color = d.color
    })
    group sr by sr.id into g1
    select new {
       ID = g1.Key,
       NamesGroup = from n in g1
                    group n by n.name into g2
                    select new {
                      Name = g2.Key,
                      ...
                    }
    };

注意:如果您从LINQPad.net下载精彩的LINQPad,在Samples中,您会发现使用Northwind示例数据库的非常好的嵌套分组示例。

© www.soinside.com 2019 - 2024. All rights reserved.