0

我有可能值的列表

|团队| |年| 胜出| “团队 1” 2014 7 “团队 2” 2015 9 “团队 1” 2014 8

我想得到结果

|团队| |年| 胜出| “团队 1” 2014 15 “团队 2” 2015 9

我尝试这样做,但我得到至少一个对象必须实现 Icomparable

 gameResults =
                    gameResults.GroupBy(t => new{t.ContendersName, t.Year})
                    .OrderBy(g => g.Key)
                    .Select(g => new PivotTeamResult()
                       {
                           ContendersName = g.Key.ContendersName,
                           Year = g.Key.Year,
                           Wins = g.Sum(x => x.Wins)                          

                       }).ToList();

我将 IComparable 实现为

公共 int CompareTo(对象 obj){

        PivotTeamResult teamResult = (PivotTeamResult)obj;

        if (this.ContendersName == teamResult.ContendersName)
        {
              return this.Year.CompareTo(teamResult.Year);
        }

        return teamResult.ContendersName.CompareTo(this.ContendersName);
    }

我怎样才能得到正确的结果?

4

3 回答 3

3

在这里,您已经为 the 实现了一个比较器,PivotTeamResult但在OrderBy子句中您正在比较匿名类型{t.ContendersName, t.Year},因此您可以直接执行命令,如下所示:

gameResults =
                gameResults.GroupBy(t => new{t.ContendersName, t.Year})
                .OrderBy(g => g.Key.ContendersName)
                .ThenBy(g => g.Key.Year)
                .Select(g => new PivotTeamResult()
                   {
                       ContendersName = g.Key.ContendersName,
                       Year = g.Key.Year,
                       Wins = g.Sum(x => x.Wins)                          

                   }).ToList();
于 2013-04-28T23:49:40.637 回答
1

我不确定,但我认为您的问题在于 OrderBy 而不是 GroupBy 声明。正如我所看到的,您正在尝试 OrderBy 一个不可比较且无法排序的组键。

也许这会起作用:

  gameResults =
                gameResults.GroupBy(t => new{t.ContendersName, t.Year})
                .OrderBy(g => g.Key.ContendersName)
                .Select(g => new PivotTeamResult()
                   {
                       ContendersName = g.Key.ContendersName,
                       Year = g.Key.Year,
                       Wins = g.Sum(x => x.Wins)                          

                   }).ToList();
于 2013-04-28T23:29:23.980 回答
0

您的 CompareTo 方法不够安全,因为(PivotTeamResult)obj; 我认为这就是你需要的:

gameResults = gameResults.GroupBy(t => new {t.ContendersName, t.Year}).Select(
                   g => new PivotTeamResult()
                   {
                       ContendersName = g.Key.ContendersName,
                       Year = g.Key.Year,
                       Wins = g.Sum(x => x.Wins)                          

                   }).ToList();

如果要使用 OrderBy、Sort 或其他使用对象比较的方法,则必须实现 IComparable,在这种情况下,它不是必需的

于 2013-04-28T23:39:42.713 回答