[英]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.