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

我在一个列表中有以下对象:

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

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

Dictionary<int, List<DemoClass>>

我想按属性 GroupKeyList<DemoClass>进行分组,但是我不明白这是如何做到的,需要一些帮助。

经过一番思考,我达到了需要的行为:

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());

but, is there a way to make this into a single statement?

76909 次浏览

你已经说了一句俏皮话了。把 ToDictionary放在第一行的末尾。如果希望缩短语法,可以使用函数组合语法而不是查询语法。

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

这个会有用的! ! !

为了让 Mquander 的建议更具体:

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

当然,如果您也使用更短的变量名,就可以使它更短:)

然而,我是否可以建议使用 查一下更为合适?一个查找基本上是一个字典从一个键到 IEnumerable<T>-除非你真的 需要的值作为一个列表,它使代码更短(和更有效率)与 查找调用:

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

我跑题了,但是我来到这个话题是因为我在寻找一种在 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

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