C# - 迭代多个数组/列表的最有效方法

时间:2012-12-01 00:56:06

标签: c#

我有五个不同长度的数组,我需要遍历所有这些数组,生成所有可能的内容组合。我目前正在使用5个嵌套for循环:

for (int a = 1; a < Array1.Length - 1; a++)
  {
    for (int b = 1; b < Array2.Length - 1; b++)
      {
        for (int c = 1; c < Array3.Length - 1; c++)
          {
            for (int d = 1; d < Array4.Length - 1; d++)
              {
                for (int e = 1; e < Array5.Length - 1; e++)
                  {
                    //do something
                  }
              }
          }
      }
  }

由于阵列的大小,我最终得到了超过4.56亿次迭代。我对编程很新,特别是C#。我很好奇是否有更有效的方法来实现这一目标。

谢谢。

1 个答案:

答案 0 :(得分:5)

你经历了那么多次迭代,因为有很多种组合:这叫做combinatorial explosion。如果你必须经历所有可能的组合,你就不能更有效地做到这一点。

您可以使用递归,使用更少的代码行编写代码,或者不使用硬编码数组(在您的情况下为5)。但是,迭代次数不会改变,只会改变代码行数。

void processCombination(int[] combination) {
    // combination[i] has the index of array #i
    ...
}
void combine(int p, int[] indexes, int[] sizes) {
    if (p == indexes.Length) {
        processCombination(indexes);
    } else {
        for (indexes[p] = 0 ; indexes[p] != sizes[p] ; indexes[p]++) {
            combine(p+1, indexes, sizes);
        }
    }
}