我想获得存储在数组中的所有可能的数字组合。
例如:
使用{1,2,3,4}返回的第一个数组
1,2,3,4
1,3,4,2
1,4,2,3
2,3,4,1
2,4,1,3 etc
我怎么能这样做?
只是为了澄清 - 取一组数字:{1,2,3,4},重新排列数字序列,返回一个新数组(添加到列表中),然后重复直到找到所有可能的组合。
由于
答案 0 :(得分:1)
Here is a answer包含您想要的内容。如果您阅读其他答案,其他几种方法可以更快地运行,但使用它们会更复杂一些。
这是相关的代码,而非我自己的代码。
public static IEnumerable<IEnumerable<T>> QuickPerm<T>(this IEnumerable<T> set)
{
int N = set.Count();
int[] a = new int[N];
int[] p = new int[N];
var yieldRet = new T[N];
List<T> list = new List<T>(set);
int i, j, tmp; // Upper Index i; Lower Index j
for (i = 0; i < N; i++)
{
// initialize arrays; a[N] can be any type
a[i] = i + 1; // a[i] value is not revealed and can be arbitrary
p[i] = 0; // p[i] == i controls iteration and index boundaries for i
}
yield return list;
//display(a, 0, 0); // remove comment to display array a[]
i = 1; // setup first swap points to be 1 and 0 respectively (i & j)
while (i < N)
{
if (p[i] < i)
{
j = i%2*p[i]; // IF i is odd then j = p[i] otherwise j = 0
tmp = a[j]; // swap(a[j], a[i])
a[j] = a[i];
a[i] = tmp;
//MAIN!
for (int x = 0; x < N; x++)
{
yieldRet[x] = list[a[x]-1];
}
yield return yieldRet;
//display(a, j, i); // remove comment to display target array a[]
// MAIN!
p[i]++; // increase index "weight" for i by one
i = 1; // reset index i to 1 (assumed)
}
else
{
// otherwise p[i] == i
p[i] = 0; // reset p[i] to zero
i++; // set new index value for i (increase by one)
} // if (p[i] < i)
} // while(i < N)
}
使用此扩展方法,您可以array.QuickParm.Select(innerEnum => innerEnum.ToArray()).ToArray()
将此结果作为数组数组获取。
答案 1 :(得分:-1)
Byte[,] square4 = new Byte[,] { { 1, 2, 3, 4 }, { 1, 3, 4, 2 }, { 2, 3, 4, 1 }, { 2, 4, 1, 3 } };