繁体   English   中英

C# 动态 for 循环

[英]C# Dynamic for-loop

我让用户输入以下格式的字符串:

示例 1:A、B、C | 1,2,3 | 一、二、三

示例 2:A、B | C,D | E | F,G

我想写出所有可能的组合,例如:

示例 1 的可能输出:

A,1,a   A,2,a   A,3,a
A,1,b   A,2,b   A,3,b
A,1,c   A,2,c   A,3,c ... and so on

示例 2 的可能输出:

A,C,E,F   B,C,E,F
A,C,E,G   B,C,E,G
A,D,E,F   B,D,E,F
A,D,E,G   B,D,E,G ... and so on

我的问题是数量| 字符不是常量,因此我不能只编写固定数量的嵌套 for 循环,我不能对此进行硬编码。

这些输入字符串实际上是命令的参数。 最后,我不打算只在控制台上输出这些组合。 我想发送类似于:COMMAND A 1 a、COMMAND A 1 b 等的命令。

我不是在寻找让我复制和粘贴的代码。 我只是无法得到我遇到的这个问题背后的算法。

我尝试了很多不同的 for 循环,但没有任何效果,而且我觉得我的方法离解决方案越来越远,所以我只需要有人为我指出正确的方向,让我理解这个概念,并在最后那天我仍然必须编写自己的代码才能得到我想要的东西。

递归可以在这里帮助你。 考虑以下:

X, Y | ...的解X, Y | ... X, Y | ...可以通过解计算要计算... ,循环过X, Y和前面加上每个选项... 因此,您可以摆脱一个循环和一个递归。

写一个递归函数。

假设您有data[][]来保存输入。 有类似的东西:

solution[]
void printall(data[][], int level) {
  if (level>data.size()) print solution;
  for (c in data[level]) {
    solution[level] = c;
    printall(data, level +1);
  }
}

它可以在没有递归的情况下完成。

var s = "A,B,C|1,2|a|u,v,w";
var u = s.Split('|').Select(v => v.Split(',')).ToList();

var buffer = new List<string>();
buffer.Add("COMMAND ");
while (u.Count > 0)
{
    var t = from a in buffer
            from b in u.First()
            select a + ' ' + b;

    buffer = t.ToList();
    u.RemoveAt(0);
}

buffer列表之后将包含“递归外连接”组合字符串。

var input = "A,B,C | 1,2,3 | a,b,c".Replace(' ','');
var groups = input.split('|');
var a = groups[0].split(",");
var b = groups[1].split(",");
var c = groups[2].split(",");

foreach(var x int a)
    foreach(var y in b)
        foreach(var z in c)
        {
            Console.WriteLine(x+y+z);
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM