1

如何构建将保留 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 能够在构建组时帮助我对组中的匹配项进行排序,而不是稍后在我处理它们时。

4

1 回答 1

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);
    }
}
于 2012-06-15T21:10:00.493 回答