使用分组在列表上创建字典

And*_*air 100 .net c# linq .net-3.5

我在列表中有以下对象:

public class DemoClass
{
    public int GroupKey { get; set; }
    public string DemoString { get; set; }
    public object SomeOtherProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

Dictionary<int, List<DemoClass>>
Run Code Online (Sandbox Code Playgroud)

我想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());
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 188

只是为了使mquander的建议具体化:

var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
                             .GroupBy(x => x.GroupKey)
                             .ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());
Run Code Online (Sandbox Code Playgroud)

如果你使用更短的变量名称,你会缩短它,当然:)

但是,我可以建议查找可能更合适吗?查找基本上是从键到字典的字典IEnumerable<T>- 除非您确实需要将值作为列表,否则使用ToLookup调用使代码更短(并且更有效):

var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
                             .ToLookup(x => x.GroupKey);
Run Code Online (Sandbox Code Playgroud)

  • @sasikt:模型是你可以查找*任何*,如果密钥不存在,你只需要一个空集合.这通常比TryGetValue方法,IMO更有用. (2认同)

Pra*_*dda 84

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

这个会工作!!!


mqp*_*mqp 6

你已经把它变成了一个单行.把它放在ToDictionary第一行的末尾.如果希望它更短,请使用函数组合语法而不是查询语法.