public void TestBuildAllAndCompare()
        {
            var minCars = 4;
            var maxCars = 50;
            var minRounds = 1;
            var maxRounds = 2;

            var builder = new PartialPerfectNGenerator();

            for (var rounds = minRounds; rounds <= maxRounds; rounds++)
            {
                for (var cars = minCars; cars <= maxCars; cars++)
                {
                    try
                    {
                        var races = builder.Build(cars, rounds);
                        if (cars == 23 && rounds == 2)
                        {
                            Console.Write("");
                        }
                        var raceList = GetRaceList(cars);
                        foreach (var race in races)
                        {
                            for (int i = 0; i < race.Length; i++)
                            {
                                for (int j = 0; j < race.Length; j++)
                                {
                                    if (i != j)
                                    {
                                        var key = Key(race[i], race[j]);
                                        if (!raceList.ContainsKey(key))
                                        {
                                            Console.Write("");
                                        }
                                        raceList[key]++;
                                    }
                                }
                            }
                        }
                        var min = raceList.MinR(l => l.Value);
                        var max = raceList.MaxR(l => l.Value);
                        if (max.Value - min.Value > 1)
                        {
                            Console.WriteLine("Race {0}x{1} has a min|max of {2}|{3}", cars, rounds, string.Join("-", min.Key, min.Value), string.Join("-", max.Key, max.Value));
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("Error building {0}x{1}\n{2}", cars, rounds, e);
                    }

                }
            }
        }
        public void TestBuildAllAndCompare()
        {
            var minCars   = 4;
            var maxCars   = 50;
            var minRounds = 1;
            var maxRounds = 2;

            var builder = new PartialPerfectNGenerator();

            for (var rounds = minRounds; rounds <= maxRounds; rounds++)
            {
                for (var cars = minCars; cars <= maxCars; cars++)
                {
                    try
                    {
                        var races = builder.Build(cars, rounds);
                        if (cars == 23 && rounds == 2)
                        {
                            Console.Write("");
                        }
                        var raceList = GetRaceList(cars);
                        foreach (var race in races)
                        {
                            for (int i = 0; i < race.Length; i++)
                            {
                                for (int j = 0; j < race.Length; j++)
                                {
                                    if (i != j)
                                    {
                                        var key = Key(race[i], race[j]);
                                        if (!raceList.ContainsKey(key))
                                        {
                                            Console.Write("");
                                        }
                                        raceList[key]++;
                                    }
                                }
                            }
                        }
                        var min = raceList.MinR(l => l.Value);
                        var max = raceList.MaxR(l => l.Value);
                        if (max.Value - min.Value > 1)
                        {
                            Console.WriteLine("Race {0}x{1} has a min|max of {2}|{3}", cars, rounds, string.Join("-", min.Key, min.Value), string.Join("-", max.Key, max.Value));
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("Error building {0}x{1}\n{2}", cars, rounds, e);
                    }
                }
            }
        }
        private void BuildAndWrite(int cars, int rounds)
        {
            var builder = new PartialPerfectNGenerator();
            var races   = builder.Build(cars, rounds);

            var ints = 1.To(cars);

            foreach (var r in races)
            {
                Console.WriteLine(string.Join("\t", r));
            }
            Console.WriteLine("\t" + string.Join("\t", ints));
            foreach (var i in ints)
            {
                var racesWithI = races.Where(r => r.Contains(i));
                Console.WriteLine(i + "\t" + string.Join("\t", ints.Select(r1 => racesWithI.Count(r => r.Contains(r1)))));
            }
        }
        private void BuildAndWrite(int cars, int rounds)
        {
            var builder = new PartialPerfectNGenerator();
            var races = builder.Build(cars, rounds);

            var ints = 1.To(cars);

            foreach (var r in races)
            {
                Console.WriteLine(string.Join("\t", r));
            }
            Console.WriteLine("\t"+string.Join("\t", ints));
            foreach (var i in ints)
            {
                var racesWithI = races.Where(r => r.Contains(i));
                Console.WriteLine(i+"\t"+string.Join("\t", ints.Select(r1 => racesWithI.Count(r => r.Contains(r1)))));
            }
        }