2017-03-03 6 views
0

すべての値の組み合わせを送信してフォームが破損しているかどうかを確認して、フォームをテストしようとしています。これらは私がフォームオプションのすべての順列

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

私はこれらの分野のすべての可能な組み合わせは、その文字列のリストに追加される可能性が考えていたこれらのフィールドのリストを生成している私はExtraFieldクラスに保存されているコンボボックス

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

です私は解析することができます(私はname = opt | name = opt | name = optと考えていました)。

 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が値を持っている必要があり、私は必要があります。私は(ExtraFieldリストCountが== 3)は下記に働くものの例を提供してきましたすべての順列を1つの形式または別の形式で表します。それはそうでなければ私は手でそれをするだろう多くの順列を持つ大きなリストです。

+0

入力した例のようにテキストファイルを生成する方法はありますか? –

+0

各フィールド名*の値を含む各文字列の文字列のリスト。より良い方法がない限り。 – blagh

答えて

0

は、だから私は再帰的にそれを行うために管理ANSWER

を更新しました。

はここで全体のクラスのD:私は大学以来、これを行っていない

これはあなたのリストを通過BELOW https://gist.github.com/Rastamas/8070ae7e1471d2183451a17bcf061376

前の回答とフォーマットで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; 
    } 
関連する問題