C# 动态 for 循环

Posted

技术标签:

【中文标题】C# 动态 for 循环【英文标题】:C# Dynamic for-loop 【发布时间】:2016-08-19 23:15:06 【问题描述】:

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

示例 1:A、B、C | 1,2,3 | a,b,c

示例 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 循环,但没有任何效果,而且我觉得我的方法离解决方案越来越远,所以我只需要有人为我指出正确的方向,以便我理解这个概念并在一天结束时,我仍然需要编写自己的代码才能得到我想要的。

【问题讨论】:

我在这里看不到任何 for 循环!你有没有尝试过? 你真的得到这样的字符串:A,B,C | 1,2,3 | a,b,c ? 你可以使用 'split' 分隔成不同的数组,然后知道有多少 '|'有…… @BugFinder 我试过了,我使用嵌套的 for 循环,外循环拆分 | 和内循环拆分 , 但这绝对是错误的。我的大脑无法理解这个算法,这就是我问的原因。我知道我在这里遗漏了一个关键点,我认为需要一个动态嵌套循环,我根本不知道如何。 @S.Akbari 是的。我不是在这里询问基本的 for 循环问题,我需要循环的数量是动态的。老实说,我根本没有什么可展示的。我什至不知道采取哪种方法(感谢一些答案,现在我知道我应该尝试递归) 【参考方案1】:

递归可以在这里为您提供帮助。考虑以下几点:

X, Y | ... 的解可以通过计算... 的解、循环X, Y 并将每个选项添加到... 来计算。因此,您可以使用 一个 循环和递归。

【讨论】:

【参考方案2】:

写一个递归函数。

假设您有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);
  

【讨论】:

不,不是。这甚至不是一个合适的 C# 片段。而递归只是在另一个data数组上实现迭代的一种浪费方式。【参考方案3】:
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);
        

【讨论】:

数量 |变化 啊,抱歉,没看到提及【参考方案4】:

无需递归即可完成。

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 列表之后将包含“递归外连接”组合字符串。

【讨论】:

谢谢!我不太明白的东西:如果我要删除buffer.Add("COMMAND ")from a in buffer(当然不再有select a),那么我只会将u List 中的第一个元素添加到buffer List 中,对吗?为什么当我这样做时,我的buffer 列表中只得到u,v,w?我在这里错过了 LinQ 的概念。 u 是字符串数组的列表。 from b in u.First() 实际上是对列表中第一个数组元素的循环。

以上是关于C# 动态 for 循环的主要内容,如果未能解决你的问题,请参考以下文章

C# winform 循环动态添加了10个按钮

ComboBox 如何动态赋值 C#

如何使用 for 循环创建 UIImageView 动态网格?

OpenCL – 执行动态 for 循环

在每个 for 循环中保存具有动态名称的结构

使用fetch时如何在for循环中动态循环多个promise?