Как и все программирование, когда у вас есть последовательность похожих предметов, используйте коллекцию. В этом случае я оставил его IEnumerable
, но вы можете сделать его List
или Dictionary
на YOS
, если хотите.
var ans = table.GroupBy(t => t.Score)
.Select(tg => new {
Score = tg.Key,
OverallAverageRank = tg.Average(t => t.Ranking),
YearRankAvgs = tg.GroupBy(t => t.YOS).Select(tyg => new { YOS = tyg.Key, RankAvg = tyg.Average(t => t.Ranking) })
});
Если вам нужно заполнить диапазон лет от 1 до макс (или другое число), вы можете изменить ответ:
var ans2 = ans.Select(soryr => new {
soryr.Score,
soryr.OverallAverageRank,
YearRankDict = soryr.YearRankAvgs.ToDictionary(yr => yr.YOS),
YearMax = soryr.YearRankAvgs.Max(yr => yr.YOS)
})
.Select(soryr => new {
Score = soryr.Score,
OverAverageRank = soryr.OverallAverageRank,
YearRankAvgs = Enumerable.Range(1, soryr.YearMax).Select(yos => soryr.YearRankDict.ContainsKey(yos) ? soryr.YearRankDict[yos] : new { YOS = yos, RankAvg = 0.0 }).ToList()
});
Если вы предпочитаете, вы можете изменить исходный ans
, чтобы он возвращал RankAvg
как double?
и поставить null
вместо 0.0
при добавлении пропущенных лет.