получать повторяющиеся комбинации с помощью LINQ - PullRequest
0 голосов
/ 07 января 2012

У меня есть два числа 1,2 в одном массиве. Теперь я хочу сгенерировать все возможные комбинации массивов (размером = 5), как

1,2,0,0,0 || 2,1,0,0,0 || 1,0,2,0,0 , , , , .

Я пытался написать рекурсивную функцию, но она не работает

Теперь я хочу решить эту проблему с помощью LINQ, потому что код будет значительно меньше.

Пожалуйста, помогите мне

Ответы [ 2 ]

1 голос
/ 07 января 2012

LINQ отлично подходит для поиска;это намного хуже в генерации, так что это неправильный инструмент для работы.Так же как и рекурсия (хотя это лучший выбор, чем LINQ).То, что вам нужно, это два вложенных цикла, например:

var elements = new [] {1, 2};
for (var i = 0 ; i != 5 ; i++) {
    for (int j = 0 ; j != 5 ; j++) {
        if (i == j) continue;
        var data = new int[5];
        data[i] = elements[0];
        data[j] = elements[1];
        ProcessCombination(data);
    }
}

Вот что делает код: на каждой итерации внутреннего цикла он помещает первый и второй элемент из массива elements в различныепозиции i и j.Вложенные циклы идут от 0 до 5, обеспечивая покрытие всех комбинаций позиций.

0 голосов
/ 07 января 2012

Вы можете использовать что-то вроде этого:

  public static IEnumerable<IEnumerable<T>> Permute<T>(IEnumerable<T> list)
  {
            if (list.Count() == 1)
                return new List<IEnumerable<T>> { list };

            return list.Select((a, i1) => Permute(
                            list.Where((b, i2) => i2 != i1)).Select(
                                  b => (new List<T> { a }).Union(b))
                            ).SelectMany(c => c);
   };

.....

var result = Permute(new int[]{1,2,0,0,0});  
...