2017-03-03 74 views
0

我試圖通過提交所有值的組合來測試表單,以查看它是否中斷。這些是我已經存儲在ExtraField類表單選項的所有排列

public class ExtraField 
{ 
    public String Name = ""; //name of form key 
    public Dictionary<String, String> Options = new Dictionary<String, String>(); //Format: OptionText, Value 
} 

我已經產生了這些領域

List<ExtraField> efList = new List<ExtraField>(); 

我想這些領域的所有可能組合的列表可以被添加到字符串列表組合框是我可以解析(我在考慮name = opt | name = opt | name = opt)。我提供什麼將下面工作的範例(其中ExtraField列表計數== 3):

 List<ExtraField> efList = new List<ExtraField>(); 
     ExtraField f1 = new ExtraField(); 
     f1.Name = "name1"; 
     f1.Options.Add("text", "option1"); 
     f1.Options.Add("text2", "option2"); 
     f1.Options.Add("text3", "option3"); 
     efList.Add(f1); 
     ExtraField f2 = new ExtraField(); 
     f2.Name = "name2"; 
     f2.Options.Add("text", "option1"); 
     f2.Options.Add("text2", "option2"); 
     f2.Options.Add("text3", "option3"); 
     f2.Options.Add("text4", "option4"); 
     efList.Add(f2); 
     ExtraField f3 = new ExtraField(); 
     f3.Name = "name3"; 
     f3.Options.Add("text2", "option1"); 
     f3.Options.Add("text3", "option2"); 
     f3.Options.Add("text4", "option3"); 
     f3.Options.Add("text5", "option4"); 
     f3.Options.Add("text6", "option5"); 
     efList.Add(f3); 

應該產生

name1=option1|name2=option1|name3=option1 
name1=option1|name2=option1|name3=option2 
name1=option1|name2=option1|name3=option3 
name1=option1|name2=option1|name3=option4 
name1=option1|name2=option1|name3=option5 
name1=option1|name2=option2|name3=option1 
name1=option1|name2=option2|name3=option2 
name1=option1|name2=option2|name3=option3 
name1=option1|name2=option2|name3=option4 
name1=option1|name2=option2|name3=option5 
name1=option1|name2=option3|name3=option1 
name1=option1|name2=option3|name3=option2 
name1=option1|name2=option3|name3=option3 
name1=option1|name2=option3|name3=option4 
name1=option1|name2=option3|name3=option5 
name1=option1|name2=option4|name3=option1 
name1=option1|name2=option4|name3=option2 
name1=option1|name2=option4|name3=option3 
name1=option1|name2=option4|name3=option4 
name1=option1|name2=option4|name3=option5 
name1=option2|name2=option1|name3=option1 
...etc 

列表中的所有ExtraFields需要有一個價值,我需要一種或另一種格式的所有排列。這是一個很多排列的大名單,否則我會用手做。

+0

是你的問題如何生成一個文本文件,如你提供的例子? –

+0

包含每個字段名稱值的每個字符串的字符串列表*。除非有更好的方法。 – blagh

回答

0

修訂ANSWER

所以我設法遞歸地做到這一點。我從大學沒有這樣做:d

這裏是全班同學: https://gist.github.com/Rastamas/8070ae7e1471d2183451a17bcf061376

以前的答案BELOW

這種經歷你的清單,並添加字符串到StringBuilder格式你顯示

foreach (var item in efList) 
{ 
    foreach (var option in item.Options) 
    { 
     stringBuilder.Append(String.Format("{0}={1}|", item.Name, option.Value)); 
    } 
    stringBuilder.Remove(stringBuilder.Length - 1, 1); 
    stringBuilder.AppendLine(); 
} 

然後,你可以使用stringBuilder.ToString()讓整個列表。

+0

非常感謝您的回覆。不過,我需要做得有點不同。我用示例輸入和示例期望輸出更新了我的問題 – blagh

0

嗯,我做到了......但我並不以此爲榮。我確信遞歸地做一個更好的方法。希望這有助於某人。

public List<String> GetFormPermutations(List<ExtraField> inList) 
    { 
     List<String> retList = new List<String>(); 

     int[] listIndexes = new int[inList.Count]; 
     for (int i = 0; i < listIndexes.Length; i++) 
      listIndexes[i] = 0; 

     while (listIndexes[inList.Count-1] < inList.ElementAt(inList.Count-1).Options.Count) 
     { 
      String cString = ""; 
      //after this loop is complete. a line is done. 
      for (int i = 0; i < inList.Count; i++) { 
       String key = inList.ElementAt(i).Name; 
       Dictionary<String, String> cOptions = inList.ElementAt(i).Options; 
       String value = cOptions.ElementAt(listIndexes[i]).Value; 
       cString += key + "=" + value; 

       if (i < inList.Count - 1) 
        cString += "|"; 
      } 
      retList.Add(cString); 

      listIndexes[0]++; 
      for(int i = 0; i < inList.Count -1; i++) 
      { 
       if (listIndexes[i] >= inList.ElementAt(i).Options.Count) 
       { 
        listIndexes[i] = 0; 
        listIndexes[i + 1]++; 
       } 
      } 
     } 
     return retList; 
    } 
相關問題