簡體   English   中英

LINQ Group由幾個帶有IComparable異常的值組成

[英]LINQ GroupBy by several values with IComparable exception

我有可能的值列表

|團隊| |年| 勝| “Team1”2014 7 “Team2”2015 9“Team1”2014 8

我想得到結果

|團隊| |年| 勝| “Team1”2014 15 “Team2”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實現為

public int CompareTo(object obj){

        PivotTeamResult teamResult = (PivotTeamResult)obj;

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

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

我怎樣才能得到正確的結果?

我不確定,但我認為你的問題在於OrderBy而不是GroupBy語句。 正如我所看到的,您正在嘗試訂購一個無法比較且無法排序的組密鑰。

也許這會奏效:

  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();

這里你已經為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();

因為(PivotTeamResult)obj ,你的CompareTo方法不夠安全; 我認為這就是你需要的:

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,在這種情況下它不是必需的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM