【问题标题】:All permutations of form options表单选项的所有排列
【发布时间】:2017-03-03 08:32:20
【问题描述】:

我正在尝试通过提交所有值的组合来测试表单,以查看它是否中断。这些是我存储在 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 list 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

列表中的所有 ExtraFields 都需要有一个值,我需要一种或另一种格式的所有排列。这是一个包含很多排列的大列表,否则我会手动完成。

【问题讨论】:

  • 您的问题是如何像您提供的示例那样生成文本文件?
  • 字符串列表,每个字符串包含每个字段名称的值*。除非有更好的方法。

标签: c# .net permutation


【解决方案1】:

好吧,我做到了……但我并不为此感到自豪。我确信有更好的递归方式。希望这对某人有所帮助。

    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;
    }

【讨论】:

    【解决方案2】:

    更新答案

    所以我设法递归地做到了。从大学开始我就没有这样做过: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() 来获取整个列表。

    【讨论】:

    • 非常感谢您的回复。不过,我需要做一些不同的事情。我用示例输入和示例所需输出更新了我的问题
    猜你喜欢
    • 1970-01-01
    • 2021-11-23
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 2010-11-09
    • 1970-01-01
    • 2014-01-14
    相关资源
    最近更新 更多