private static LaneStat BuildLaneStat(Race[] races, Func<Race, RaceResult> whichCar, int laneNumber)
 {
     var laneResults = races.Select(whichCar).ToArray();
     return new LaneStat
     {
         LaneNumber = laneNumber,
         FirstPlaceFinishes = laneResults.Count(r => r.Place == 1),
         SecondPlaceFinishes = laneResults.Count(r => r.Place == 2),
         ThirdPlaceFinishes = laneResults.Count(r => r.Place == 3),
         FourthPlaceFinishes = laneResults.Count(r => r.Place == 4),
         Points = laneResults.Sum(r => r.Points),
     };
 }
        public Tournament Build(string round = "prelim")
        {
            var races = new SortedList<double, Race>();
            var groups = new List<Group>();
            for (var groupIndex = 0; groupIndex < _groups.Count; groupIndex++)
            {
                var group = _groups[groupIndex];
                groups.Add(group.Item1);
                var carsByNumber = group.Item1.Cars.ToDictionary(c => c.Number);
                var length = group.Item2.Length;
                for (var i = 0; i < length; i++)
                {
                    var offset = (groupIndex+1)/1000.0;
                    var pctDoneBefore = ((double) i)/length + offset;
                    var pctDoneAfter = ((double) i + 1)/length - offset;
                    var pctDone = pctDoneBefore >= 0.5 ? pctDoneBefore : pctDoneAfter;
                    var raceDef = group.Item2[i];
                    var race = new Race
                    {
                        Round = round,
                        Group = group.Item1.Name,
                        Car1 = new RaceResult{Car = carsByNumber[raceDef.Lane1]},
                        Car2 = new RaceResult{Car = carsByNumber[raceDef.Lane2]},
                        Car3 = new RaceResult{Car = carsByNumber[raceDef.Lane3]},
                        Car4 = new RaceResult{Car = carsByNumber[raceDef.Lane4]},
                    };
                    races.Add(pctDone, race);
                }
            }

            var raceList = races.Values.ToArray();
            for (var i = 0; i < raceList.Length; i++)
            {
                raceList[i].RaceNumber = i + 1;
            }

            var tournament = new Tournament {Groups = groups.ToArray(), Races = raceList.ToArray(), Name = TournamentName};
            return tournament;
        }
 private static void AddGroupsAndRaces(this Tournament tournament, Group[] groupsToAdd, Race[] racesToAdd)
 {
     var groups = tournament.Groups.ToList();
     groups.AddRange(groupsToAdd);
     var races = tournament.Races.ToList();
     races.AddRange(racesToAdd);
     for (int i = 0; i < races.Count; i++)
     {
         races[i].RaceNumber = i + 1;
     }
     tournament.Groups = groups.ToArray();
     tournament.Races = races.ToArray();
 }