【问题标题】:How do I create a nested group-by dictionary using LINQ?如何使用 LINQ 创建嵌套的分组字典?
【发布时间】:2013-04-11 22:57:12
【问题描述】:

如何使用 LINQ 为下表创建嵌套分组?我想按Code 分组,然后按Mktcode

Code Mktcode Id
==== ======= ====
1    10      0001 
2    20      0010 
1    10      0012 
1    20      0010 
1    20      0014 
2    20      0001
2    30      0002
1    30      0002
1    30      0005

我想要一本字典,最后像

Dictionary<Code, List<Dictionary<Mktcode, List<Id>>>>

所以这个字典的值是

{1, ({10,(0001,0012)}, {20,(0010,0014)}, {30, (0002, 0005)})},
{2, ({20,(0001, 0010)}, {30, (0020)} )}

【问题讨论】:

    标签: linq


    【解决方案1】:

    我会这样想:

    • 您主要是按代码分组,所以先这样做
    • 对于每个组,您仍然有一个结果列表 - 因此在此处应用另一个分组。

    类似:

    var groupedByCode = source.GroupBy(x => x.Code);
    
    var groupedByCodeAndThenId = groupedByCode.Select(group =>
        new { Key=group.Key, NestedGroup = group.ToLookup
                                             (result => result.MktCode, result => result.Id));
    
    var dictionary = groupedByCodeAndThenId.ToDictionary
        (result => result.Key, result => result.NestedGroup);
    

    这会给你一个Dictionary&lt;Code, Lookup&lt;MktCode, Id&gt;&gt; - 我认为这就是你想要的。但它完全未经测试。

    【讨论】:

    • 天哪,你说得对。你的精神力简直令人难以置信。
    【解决方案2】:

    您可以使用group by into 构建查找(各种字典>)

    var lines = new []
    {
        new {Code = 1, MktCode = 10, Id = 1},
        new {Code = 2, MktCode = 20, Id = 10},
        new {Code = 1, MktCode = 10, Id = 12},
        new {Code = 1, MktCode = 20, Id = 10},
        new {Code = 1, MktCode = 20, Id = 14},
        new {Code = 2, MktCode = 20, Id = 1},
        new {Code = 2, MktCode = 30, Id = 2},
        new {Code = 1, MktCode = 30, Id = 2},
        new {Code = 1, MktCode = 30, Id = 5},
    };
    
    var groups = from line in lines
        group line by line.Code
        into codeGroup
        select new
        {
            Code = codeGroup.Key,
            Items = from l in codeGroup
                group l by l.MktCode into mktCodeGroup
                select new
                {
                    MktCode = mktCodeGroup.Key, 
                    Ids = from mktLine in mktCodeGroup
                        select mktLine.Id
                }
        };
    

    【讨论】:

    • 关于如何将组转换为字典类型的任何想法?
    • groups.ToDictionary(g => g.Key, g => g.ToList())
    【解决方案3】:

    我会这样做:

    Dictionary<Code, Dictionary<MktCode, List<Id>>> myStructure =
      myList
        .GroupBy(e => e.Code)
        .ToDictionary(
          g => g.Key,
          g => g
            .GroupBy(e => e.Mktcode)
            .ToDictionary(
              g2 => g2.Key,
              g2 => g2.Select(e => e.Id).ToList()
            )
       )
    

    这是流程的细分:

    按代码对元素进行分组,并创建一个外部字典,其中键是该代码。

      myList
        .GroupBy(e => e.Code)
        .ToDictionary(
          g => g.Key,
    

    对于外部字典中的每个键,通过 Mktcode 重新组合元素并创建内部字典。

          g => g
            .GroupBy(e => e.Mktcode)
            .ToDictionary(
              g2 => g2.Key,
    

    对于内部字典中的每个键,投影这些元素的 id 并将其转换为列表。

              g2 => g2.Select(e => e.Id).ToList()
            )
       )
    

    【讨论】:

    • 这是我理解的。谢谢!
    猜你喜欢
    • 2023-04-08
    • 2021-09-14
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多