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 循环的主要内容,如果未能解决你的问题,请参考以下文章