通过简化循环循环内部的循环

时间:2015-02-10 17:05:05

标签: c# loops combinations

我一直试图通过将其置于循环中来简化以下内容。

int A0 = 0, A1 = 0, A2 = 0;

for (A0 = 0; A0 < nums.Length; A0++)
{
    for (A1 = 0; A1 < nums.Length; A1++)
    {
        for (A2 = 0; A2 < nums.Length; A2++)
        {
            string ss = nums[A0] + nums[A1] + nums[A2];
            dataGridView1.Rows.Add(new string[] { ss });
        }
    }
}
像A0,A1和A2一样,我需要一直到A75。如果我像上面一样筑巢,我可以得到结果。但我怎么能把它放在一个循环上...... ??

我试过这个:

int[] A = new int[3];

for (int i = 0; i < A.Length; i++)
{
    for (A[i] = 0; A[i] < nums.Length; A[i]++)
    {
        string ss = "";
        for (int j = 0; j < A.Length; j++) ss += nums[A[i]];
        dataGridView1.Rows.Add(new string[] { ss });
    }
}

但它只会像...一样表现。

int A0 = 0, A1 = 0, A2 = 0;
for (A0 = 0; A0 < nums.Length; A0++)
{
    string ss = nums[A0] + nums[A1] + nums[A2];
    dataGridView1.Rows.Add(new string[] { ss });
}
for (A1 = 0; A1 < nums.Length; A1++)
{
    string ss = nums[A0] + nums[A1] + nums[A2];
    dataGridView1.Rows.Add(new string[] { ss });
}
for (A2 = 0; A2 < nums.Length; A2++)
{
    string ss = nums[A0] + nums[A1] + nums[A2];
    dataGridView1.Rows.Add(new string[] { ss });
}

2 个答案:

答案 0 :(得分:2)

相当于

public void DoNestedThings()
{
    for(var A0 = 0; A0 < _max; A0 ++)
    {
        //...
        for(var i5 = 0; i5 < _max; i5++)
        {
            DoThing(new List<int>{i0, ..., i5});
        }
    }
}

将是:

private void DoNestedThings(int depth, Stack<int> indexes)
{
    if(depth == 0)
    {
        DoThing(indexes);
        return;
    }
    for(var i = 0; i < _max; i++)
    {
        indexes.Push(i);
        DoNestedThings(depth-1, indexes);
        indexes.Pop();
    }
}

public void DoNestedThings()
{
    DoNestedThings(5, new Stack<int>());
}

这将使用单个循环替换嵌套循环,但随后使用递归多次进入该循环。每次使用DoNestedThings&gt;调用depth方法时0,你进入另一个循环。

(注意传递给DoThing的索引的顺序将被颠倒)

答案 1 :(得分:1)

请参阅Computing a Cartesian Product with LINQ,了解如何编写一个可以计算编译时未知的许多集合的笛卡尔积的方法,这正是您尝试解决的问题。

然后,您只需使用Repeat

动态创建集合集合
var query = Enumerable.Repeat(nums, 75)
    .CartesianProduct()
    .Select(combination => combination.Sum());

当然,此类查询的大小将为pretty large。这种方法将利用延迟执行来允许您随时计算每个结果,而不是在给出任何结果之前计算每个结果,但如果您实际尝试计算相应百分比的值(或所有值),那么#39;等待......很长一段时间。