使用LINQ重复组合

时间:2012-01-07 13:41:51

标签: c# .net linq combinations

我在一个数组中有两个数字1,2。现在我想生成所有可能的数组组合(大小= 5),如

1,2,0,0,0 || 2,1,0,0,0 || 1,0,2,0,0 。 。 。 。

我尝试编写一个递归函数,但它不能正常工作

现在我想用LINQ解决这个问题,因为代码会非常小。

请帮帮我

2 个答案:

答案 0 :(得分:1)

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数组中的第一个和第二个元素放在不同的位置ij。嵌套循环从0转到5,确保涵盖所有位置组合。

答案 1 :(得分:-1)

您可以使用以下内容:

  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});