2016-04-26 122 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