<p>根据尊敬的埃里克·利珀特(Eric Lippert)的以下评论,对OPs的初衷进行了编辑:</p>
<pre><code>public void OutputSequence(int length){
Recurse(length-1, Enumerable.Range(1, length).ToArray(), new int[length]);
}
public void Recurse(int position, int[] arr, int[] state){
if (position == -1){
PrintState(state);
return;
}
for (int i = 0; i < arr.Length; i++)
{
state[position] = arr[i];
Recurse(position-1, arr, state);
}
}
public void PrintState(int[] state){
for (int i = 0; i < state.Length; i++)
Console.WriteLine ("{0} {1}",i+1, state[i]);
Console.WriteLine ();
}
</code></pre>
<p><code>OutputSequence(5);</code>将给出操作最初请求的输出。在</p>
<p>旧答案</p>
<p>你要找的是一个<a href="http://blogs.msdn.com/b/ericlippert/archive/2010/06/28/computing-a-cartesian-product-with-linq.aspx" rel="nofollow noreferrer">Cartesian Product</a>。林肯是你的朋友:</p>
^{pr2}$
<p>编辑:为了好玩,这里有一个方法来做N元笛卡尔积。在</p>
<pre><code>public IEnumerable<IEnumerable<int>> NAryCartesianProduct(int upper, int times){
if (times == 0)
return Enumerable.Empty<IEnumerable<int>>();
var nums = Enumerable.Range(1, upper);
IEnumerable<IEnumerable<int>> products = nums.Select(i => new[]{i});
for (int i = 1; i < times; i++)
{
products = from p in products
from n in nums
select p.Concat(new [] {n});
}
return products;
}
</code></pre>
<p>现在,您可以通过以下方式获得以前的体验:</p>
<pre><code>var p = NAryCartesianProduct(5, 2);
foreach(var i in p)
Console.WriteLine (i);
</code></pre>
<p>我相信有一种比一直创建新阵列更有效的方法,但我只是很快就搞定了:)</p>
<p>这里有一个更丰富的答案:<a href="https://stackoverflow.com/questions/3093622/generating-all-possible-combinations/3098381#3098381">Generating all Possible Combinations</a></p>
<p>编辑2:很明显,原始链接是来自那个SO帖子的答案的来源。我直到现在才读完。在</p>