using System.Collections.Generic;
public static void Main()
List<PlayerLeaderboardEntry> event1 = new List<PlayerLeaderboardEntry>();
List<PlayerLeaderboardEntry> event2 = new List<PlayerLeaderboardEntry>();
List<PlayerLeaderboardEntry> event3 = new List<PlayerLeaderboardEntry>();
var events = new List<List<PlayerLeaderboardEntry>>();
event1.Add(new PlayerLeaderboardEntry("101012001", "Naught", 35000));
event1.Add(new PlayerLeaderboardEntry("101012011", "Fred", 25000));
event1.Add(new PlayerLeaderboardEntry("101012021", "Tom", 45000));
event1.Add(new PlayerLeaderboardEntry("101012051", "Bob", 75000));
event1.Add(new PlayerLeaderboardEntry("101012087", "TRUMP", 115000));
event2.Add(new PlayerLeaderboardEntry("101012001", "Naught", 20000));
event2.Add(new PlayerLeaderboardEntry("101012021", "Tom", 25000));
event2.Add(new PlayerLeaderboardEntry("101012051", "Bob", 15000));
event2.Add(new PlayerLeaderboardEntry("101012087", "TRUMP", 145000));
event2.Add(new PlayerLeaderboardEntry("101012000", "Hillary", 100));
event3.Add(new PlayerLeaderboardEntry("101012001", null, 45000));
event3.Add(new PlayerLeaderboardEntry("101012002", "Ted", 45000));
event3.Add(new PlayerLeaderboardEntry("101012003", "Person", 45000));
event3.Add(new PlayerLeaderboardEntry("101012021", "Tom", 45000));
event3.Add(new PlayerLeaderboardEntry("101012051", "Bob", 45000));
event3.Add(new PlayerLeaderboardEntry("101012087", "TRUMP", 45000));
event3.Add(new PlayerLeaderboardEntry("101012000", "Hillary", 100));
var res = events.SelectMany(x => x).GroupBy(t => new { ID = t.player_id, Name=t.player_name })
Average = g.Sum(p => p.score) / events.Count(),
TotalScore = g.Sum(p => p.score),
Console.WriteLine("{0,16} {1,15} {2,15} {3,15} {4,15} {5,15}", "Player Name", "Event 1 Score", "Event 2 Score", "Event 3 Score", "Total Score", "Average Score");
Console.WriteLine("---------------- -------------- ------------- ------------- ------------- -------------");
foreach(var v in res.OrderByDescending(x=>x.Average)){
Console.WriteLine("{0,16} {1,15} {2,15} {3,15} {4,15} {5,15}", v.Name, event1.Where(p=>p.player_id == v.ID).Select(x=>x.score).FirstOrDefault() , event2.Where(p=>p.player_id == v.ID).Select(x=>x.score).FirstOrDefault(), event3.Where(p=>p.player_id == v.ID).Select(x=>x.score).FirstOrDefault(), v.TotalScore, v.Average);
public class PlayerLeaderboardEntry
public string player_id { get; set; }
public string player_name { get; set; }
public int score { get; set; }
public PlayerLeaderboardEntry(string player_id, string player_name, int score)
this.player_id = player_id;
this.player_name = player_name;