GroupBy和OrderBy

时间:2013-07-22 15:47:17

标签: c# linq

我正在尝试将GroupBy然后OrderBy添加到我拥有的列表中。到目前为止,这是我的代码:

reportList.GroupBy(x => x.Type).ToDictionary(y=>y.Key, z=>z.OrderBy(a=>a.Lost));

在我问linq的最后一个问题的帮助下,我认为ToDictionary可能不需要,但没有它我不知道如何访问内部值。

要明确,我需要GroupBy Type属性,并希望我得到的内部组OrderByLost属性(整数)。我想知道是否有更好,更有效的方式,或者至少比我做的更好。

非常感谢解释,而不只是答案。

3 个答案:

答案 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)

您的代码基本上做了以下事情:

  1. 按类型分组元素
  2. 将GroupBy结果转换为字典,其中字典的值是来自对OrderBy的调用的IEnumerables
  3. 就代码的正确性而言,它是完美的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) });