用分组在一个列表上创build一个字典
我在列表中有以下对象:
public class DemoClass { public int GroupKey { get; set; } public string DemoString { get; set; } public object SomeOtherProperty { get; set; } }
现在,我想创build下面的字典:
Dictionary<int, List<DemoClass>>
我想通过属性GroupKey
对List<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
希望这对任何需要这种查询的人都有帮助。