2017-03-03 40 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; 
    } 
相关问题