表单选项的所有排列

时间:2017-03-03 08:32:21

标签: c# .net permutation

我试图通过提交所有值的组合来测试表单,看它是否会中断。这些是我存储在ExtraField类

中的ComboBox
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列表Count == 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

列表中的所有ExtraField都需要有一个值,我需要一种或另一种格式的所有排列。它是一个包含大量排列的大清单,否则我会手工完成。

2 个答案:

答案 0 :(得分:0)

更新的答案

所以我设法递归地做了。大学毕业后我还没有这样做:D

全班同学: 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()来获取整个列表。

答案 1 :(得分: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;
    }