代码之家  ›  专栏  ›  技术社区  ›  Andreas Niedermair

在具有分组的列表上创建字典

  •  93
  • Andreas Niedermair  · 技术社区  · 16 年前

    public class DemoClass
    {
        public int GroupKey { get; set; }
        public string DemoString { get; set; }
        public object SomeOtherProperty { get; set; }
    }
    

    现在,我想用它创建以下词典:

    Dictionary<int, List<DemoClass>>
    

    List<DemoClass> GroupKey ,但我不明白这是怎么做到的,还有一些帮助。

    经过一番思考,我通过以下方式实现了所需的行为:

    var groupedDemoClasses = from demoClass in mySepcialVariableWhichIsAListOfDemoClass
                                group demoClass by demoClass.GroupKey
                                into groupedDemoClass
                                select groupedDemoClass;
    var neededDictionary = groupedDemoClass.ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());
    

    但是,有没有一种方法可以把它变成一个单独的声明呢?

    4 回复  |  直到 12 年前
        1
  •  204
  •   Community CDub    8 年前

    只是为了 mquander's suggestion

    var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
                                 .GroupBy(x => x.GroupKey)
                                 .ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());
    

    当然,如果使用更短的变量名,则会使其更短:)

    Lookup 可能更合适?查找基本上是从一个键到另一个键的字典 IEnumerable<T> -除非你真的 值作为一个列表,它使用 ToLookup 电话:

    var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
                                 .ToLookup(x => x.GroupKey);
    
        2
  •  88
  •   Dov    11 年前
    var groupedDemoClasses = (from demoClass in mySepcialVariableWhichIsAListOfDemoClass
                              group demoClass by demoClass.GroupKey
                              into groupedDemoClass
                              select groupedDemoClass).ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());
    

    这个可以用!!!

        3
  •  6
  •   mqp    16 年前

    ToDictionary 在你第一行的末尾。如果希望它更短,请使用函数组合语法而不是查询语法。

        4
  •  3
  •   Mark    15 年前

    轻微地 这里没有话题,但我找到了这个线索,因为我在寻找一种方法,在Linq中创建一个字典,这里的对话引导我找到了答案。。。

    可以 使用linq创建多级词典,这对于具有多个要搜索的键或维度的场景非常有用。诀窍是创建一个分组,然后将其转换为字典,如下所示:

      Dim qry = (From acs In ActualSales _
                 Group By acs.ProductID Into Group _
                 Select ProductID, Months = Group.ToDictionary(Function(c) c.Period) _
                ).ToDictionary(Function(c) c.ProductID)
    

    生成的查询可按如下方式使用:

     If qry.ContainsKey(_ProductID) Then
          With qry(_ProductID)
              If .Months.ContainsKey(_Period) Then
                 ...
              End If
          End With
     End If
    

    希望这对其他需要此类查询的人有所帮助。