С людьми, превращенными в команды из двух человек, как создавать матчи, каждая команда играет только один раз - PullRequest
0 голосов
/ 17 января 2020

Используя эту процедуру перестановки в качестве отправной точки, я пытаюсь создать процедуру для соревнования, в котором каждый участник выступает с каждым участником по одному разу. Я предполагаю, что мне нужно перебрать коллекцию, выталкивая пару из списка, когда-то использованного, но я застрял. Пожалуйста, помогите.

class Program
{
    static void Main(string[] args)
    {
        var individuals = new List<string> { "1", "2", "3", "4", "5", "6", "7", "8" };
        IEnumerable<IEnumerable<string>> teams = GetPermutations(individuals, 2);

        /* Rules:
            * - each team may play only once
            * - a player may not oppose themselves in a match
            * A potential result set:
            * - 1|2 vs 3|4, 5|6 vs 7|8
            * - 1|3 vs 6|8, 2|4 vs 5/7
            * - 1|8 vs 2|7, 3|6 vs 4|5
            * - 1|7 vs 3|5, 2|8 vs 4|6
            * - 1|5 vs 4|8, 2|6 vs 3|7
            * - 1|4 vs 6|7, 2|3 vs 5|8
            * - 1|6 vs 2|5, 4|7 vs 3|8
            */

        Console.ReadKey();
    }

    static IEnumerable<IEnumerable<T>> GetPermutations<T>(IEnumerable<T> individuals, int teamSize)
    {
        int i = 0;
        foreach (var individual in individuals)
        {
            if (teamSize == 1)
                yield return new T[] { individual };
            else
            {
                foreach (var result in GetPermutations(individuals.Skip(i + 1), teamSize - 1))
                    yield return new T[] { individual }.Concat(result);
            }

            ++i;
        }
    }
}
...