我正在尝试将GroupBy
然后OrderBy
添加到我拥有的列表中。到目前为止,这是我的代码:
reportList.GroupBy(x => x.Type).ToDictionary(y=>y.Key, z=>z.OrderBy(a=>a.Lost));
在我问linq的最后一个问题的帮助下,我认为ToDictionary
可能不需要,但没有它我不知道如何访问内部值。
要明确,我需要GroupBy
Type
属性,并希望我得到的内部组OrderBy
为Lost
属性(整数)。我想知道是否有更好,更有效的方式,或者至少比我做的更好。
非常感谢解释,而不只是答案。
答案 0 :(得分:3)
是的,有更好的方法。不要对变量使用随机名称(x,y,z,a):
reportList.GroupBy(r => r.Type)
.ToDictionary(g => g.Key, g => g.OrderBy(r => r.Lost));
您甚至可以使用长名称来使代码更具描述性(取决于您创建查询的上下文)
reportList.GroupBy(report => report.Type)
.ToDictionary(group => group.Key,
group => group.OrderBy(report => report.Lost));
答案 1 :(得分:2)
您的代码基本上做了以下事情:
就代码的正确性而言,它是完美的IMO,但也许可以在效率方面得到改善(即使取决于您的需求)。
事实上,使用您的代码,每次枚举时都会对字典的值进行延迟评估,从而调用OrderBy
方法。
可能你可以执行一次并以这种方式存储结果:
var dict = reportList
.GroupBy(x => x.Type)
.ToDictionary(y => y.Key, z => z.OrderBy(a => a.Lost).ToList());
// note the ToList call
或以这种方式:
var dict = reportList.OrderBy(a => a.Lost)
.GroupBy(x => x.Type)
.ToDictionary(y => y.Key, z => z);
// here we order then we group,
// since GroupBy guarantees to preserve the original order
答案 2 :(得分:1)
对我来说很好看。如果使用匿名类型而不是字典,则可能会提高使用此查询结果的代码的可读性。
reportList.GroupBy(r => r.Type)
.Select(g => new { Type = g.Key, Reports = g.OrderBy(r => r.Lost) });