首页 > 解决方案 > C# 中的嵌套 GroupBy

问题描述

有一个具有这种结构的对象:

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#dictionarygroup-by

解决方案


你在正确的轨道上,但是这里是实现两个嵌套级别分组的 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>>>


推荐阅读