用分组在一个列表上创build一个字典

我在列表中有以下对象:

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

现在,我想创build下面的字典:

 Dictionary<int, List<DemoClass>> 

我想通过属性GroupKeyList<DemoClass> GroupKey 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()); 

但是,有没有办法把它变成一个单一的陈述?

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

这一个将工作!

为了使姆甘德的build议具体化:

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

当然,如果你使用较短的variables名称,那么你会缩短它:)

但是,我可以build议查找可能更合适吗? 查找基本上是一个从IEnumerable<T>键的字典 – 除非你真的需要这些值作为列表,它使得代码在ToLookup调用中更短(更高效):

 var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass .ToLookup(x => x.GroupKey); 

你已经做了一个单线。 只需将ToDictionary放在第一行的末尾即可。 如果您希望它更短,请使用function组合语法而不是查询语法。

我在这里稍微偏离主题,但是我得到了这个线程becausde我正在寻找一种方法来创build一个字典在Linq的字典,这里的对话导致我的答案…

可以使用linq来创build多级字典,这对于您想要search的关键字或维度不止一个的场景很有用。 诀窍是创build一个分组,然后将其转换为字典,如下所示:

  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 

希望这对任何需要这种查询的人都有帮助。