我在一个数组中有两个数字1,2。现在我想生成所有可能的数组组合(大小= 5),如
1,2,0,0,0 || 2,1,0,0,0 || 1,0,2,0,0 。 。 。 。
我尝试编写一个递归函数,但它不能正常工作
现在我想用LINQ解决这个问题,因为代码会非常小。
请帮帮我
答案 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
数组中的第一个和第二个元素放在不同的位置i
和j
。嵌套循环从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});