2016-04-26 81 views
-11

我有用户输入在这些格式的字符串:C#动态for循环

实施例1:A,B,C | 1,2,3 | a,b,c

实施例2:A,B | C,D | E | F,G

欲写出所有可能的组合,使得:例如2

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 

可能的输出:

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 
例如1

可能的输出

我的问题是|字符数量不恒定,所以我不能只写一个固定数量的ne sted for循环,我不能硬编码这个。

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

我不想为我复制和粘贴代码。我无法得到我遇到的这个问题背后的算法。

我已经尝试了很多不同的for-loops,但没有任何工作,我觉得我的方法越来越离开解决方案,所以我只需要有人指点我以正确的方向来理解概念和在这一天结束的时候,我仍然需要做我自己的代码才能获得我想要的。

+1

我在这里看不到任何循环!你有尝试过什么吗? –

+0

你确实得到了这样一个字符串:'A,B,C | 1,2,3 | a,b,c'? –

+0

你可以使用'split'分成不同的数组,然后知道有多少'|'有... – Th0rndike

回答

0

可以毫不递归来完成。

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

+0

谢谢!我不太明白的东西:如果我要从缓冲区中删除'buffer.Add(“COMMAND”)和'(当然不会再选择''),那么我只会添加第一个元素'u'列入'buffer'列表正确吗?当我这样做时,我只在''buffer'列表中获得'u,v,w'?我在这里错过了LinQ的概念。 –

+0

'u'是字符串数组列表。 u.First()中的from b实际上是一个循环遍历列表中第一个数组的元素。 –

0

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

X, Y | ...到的溶液可以通过该溶液的计算到...,遍历X, Y和预先计算每个选项...来计算。因此,你可以使用一个循环和递归。

+0

您能否详细说明一下?谢谢.. –

0

写一个递归函数。

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

这是正确的做法 – user853710

+0

不,不是。这甚至不是一个合适的C#片段。递归只是对其他'data'数组执行迭代的浪费方式。 –

-1
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); 
     } 
+0

|的数量变化 – j4rey89

+0

谢谢@ j4rey89。 –

+0

啊,对不起,没有看到记录 – user853710