0

我正在尝试做一个GroupBy然后OrderBy到我拥有的列表。到目前为止,这是我的代码:

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

借助我在 linq 上提出的最后一个问题,我认为这ToDictionary可能是不需要的,但没有它我不知道如何访问内部价值。

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

非常感谢您提供解释而不仅仅是答案。

4

3 回答 3

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));
于 2013-07-22T16:05:57.503 回答
2

您的代码基本上执行以下操作:

  1. 按类型分组元素
  2. 将 GroupBy 结果转换为字典,其中字典的值是来自对 OrderBy 的调用的 IEnumerables

就代码正确性而言,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
于 2013-07-22T16:09:23.610 回答
1

在我看来很好。如果您使用匿名类型而不是 Dictionary,您可能会提高使用此查询结果的代码的可读性。

reportList.GroupBy(r => r.Type)
    .Select(g => new { Type = g.Key, Reports = g.OrderBy(r => r.Lost) });
于 2013-07-22T15:59:31.397 回答