GroupBy失去了ThenBy排序顺序

时间:2012-06-15 20:51:03

标签: linq linq-to-entities

如何构建一个保留ThenBy顺序的表达式? 下面的表达式生成由Bowler.Number排序的组,但不对每个组的匹配进行排序。

public class Match
{
   public int Id { get; set; }
   public virtual Bowler Bowler { get; set; }
   public byte GameNumber { get; set; }
   public int Score { get; set; }
   ...
}

public class Bowler
{
   public int Id { get; set; }
   public int Number { get; set;}
   ...
}

var GroupedMatches = db.Matches.OrderBy(m=>m.Bowler.Number).ThenBy(m=>m.GameNumber).GroupBy(m => m.Bowler.Number)

这是我想要的输出:

1
  game1 295
  game2 199
  game3 202
  game4 178
2
  game1 177
  ...

目前我使用两个类似

的foreach
foreach (var item in TheGroups){
    ... do some stuff with the Group
    foreach (var x in item.OrderBy(a =>a.Number)) { //<-- can I get rid of this OrderBy?
    ... do some stuff with the Matches in this group
   }
}

没什么大不了的,我只是认为LINQ能够帮助我在构建组的时候对组中的匹配进行排序,而不是在我处理组时。

1 个答案:

答案 0 :(得分:1)

我不确定你想要输出的是什么,因为根据游戏编号命名一个按照保龄球编号键入的组列表是非常不合情理的。

假设您想要一个有序的保龄球编号列表,每个包含一个有序的游戏列表,这样的东西可能会起作用

var GroupedMatches = db.Matches
    .GroupBy(m => m.Bowler.Number)
    .OrderBy(g => g.Key)
    .Select (g => new 
            { 
                BowlerNumber = g.Key, 
                Matches = g.OrderBy(m => m.GameNumber).ToList() 
            });

具体如何获得您正在寻找的输出

foreach(var group in GroupedMatches) {
    Console.WriteLine(group.BowlerNumber);
    foreach(var match in group.Matches) {
        Console.WriteLine("game{0} {1}", match.GameNumber, match.Score);
    }
}