代码之家  ›  专栏  ›  技术社区  ›  Leo Messi

C中嵌套的groupby#

  •  1
  • Leo Messi  · 技术社区  · 6 年前

    具有这种结构的对象:

    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());
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Darjan Bogdan    6 年前

    您所处的轨道是正确的,但是下面是要实现两个嵌套分组级别的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> 类型可以更改/投影到不同的类型,指定嵌套中合适的lamda ToDictionary 呼叫:

    例如,将呼叫更改为 ToDictionary(o => o.Key, o => o.ToList()) 结果与 Dictionary<int, Dictionary<string, List<GroupedObject>>>

        2
  •  0
  •   Cetin Basoz    6 年前

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

    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,那么在示例中,您可以使用Northwind示例数据库找到一个非常好的嵌套分组示例。