Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 生成列表子集的置换<;列表<;KeyPairValue<;字符串,字符串>&燃气轮机&燃气轮机;在C中#_C#_List_Permutation - Fatal编程技术网

C# 生成列表子集的置换<;列表<;KeyPairValue<;字符串,字符串>&燃气轮机&燃气轮机;在C中#

C# 生成列表子集的置换<;列表<;KeyPairValue<;字符串,字符串>&燃气轮机&燃气轮机;在C中#,c#,list,permutation,C#,List,Permutation,请查看以下示例代码: List<List<KeyValuePair<string, string>>> list = new List<List<KeyValuePair<string, string>>>(); list.Add(new List<KeyValuePair<string, string>>()); list[0].Add(new KeyValuePair<string, st

请查看以下示例代码:

List<List<KeyValuePair<string, string>>> list = new List<List<KeyValuePair<string, string>>>();

list.Add(new List<KeyValuePair<string, string>>());
list[0].Add(new KeyValuePair<string, string>("Category 1", "Value A"));
list[0].Add(new KeyValuePair<string, string>("Category 1", "Value B"));

list.Add(new List<KeyValuePair<string, string>>());
list[1].Add(new KeyValuePair<string, string>("Category 2", "Value C"));
list[1].Add(new KeyValuePair<string, string>("Category 2", "Value D"));

list.Add(new List<KeyValuePair<string, string>>());
list[2].Add(new KeyValuePair<string, string>("Category 3", "Value E"));
我需要以一种方式重新排列这些值,其中每列将包含一个唯一的类别,并且我必须复制和交换周围的值,以便在给定类别限制的情况下实现所有可能的值排列。换句话说

+---------------------------+---------------------------+---------------------------+
| ["Category 1", "Value A"] | ["Category 2", "Value C"] | ["Category 3", "Value E"] |
+---------------------------+---------------------------+---------------------------+
| ["Category 1", "Value B"] | ["Category 2", "Value D"] | ["Category 3", "Value E"] |
+---------------------------+---------------------------+---------------------------+
| ["Category 1", "Value B"] | ["Category 2", "Value C"] | ["Category 3", "Value E"] |
+---------------------------+---------------------------+---------------------------+
| ["Category 1", "Value A"] | ["Category 2", "Value D"] | ["Category 3", "Value E"] |
+---------------------------+---------------------------+---------------------------+
请注意,为了获得唯一的行,我交换了第一列中的第三个和第四个值。在考虑我的问题时,请忽略要使用哪一列,交换哪些值并不重要,只要我以这个特定列/类别顺序的唯一行结束。另外,正如我之前所说,这只是一个例子,我需要一些无论元素数量多少都能工作的东西

以下是我到目前为止的情况(这里的变量列表与上面的相同):

我很抱歉,如果我提出了一个误导性的标题,用一句话概括整个问题有点困难。请根据您的心意编辑它


编辑:我只是错过了交换。

首先,问题的答案。请注意,在此之后,我将发布一些不会被数据结构搞糊涂的东西,这些数据结构只是通过递归显示排列

    private void button1_Click(object sender, EventArgs e)
    {
        List<List<KeyValuePair<string, string>>> list = new List<List<KeyValuePair<string, string>>>();

        list.Add(new List<KeyValuePair<string, string>>());
        list[0].Add(new KeyValuePair<string, string>("Category 1", "Value A"));
        list[0].Add(new KeyValuePair<string, string>("Category 1", "Value B"));

        list.Add(new List<KeyValuePair<string, string>>());
        list[1].Add(new KeyValuePair<string, string>("Category 2", "Value C"));
        list[1].Add(new KeyValuePair<string, string>("Category 2", "Value D"));

        list.Add(new List<KeyValuePair<string, string>>());
        list[2].Add(new KeyValuePair<string, string>("Category 3", "Value E"));

        List<List<KeyValuePair<string, string>>> sortedList = new List<List<KeyValuePair<string, string>>>();

        permutation(list, 0, new List<KeyValuePair<string, string>>());
    }


    private void permutation( List<List<KeyValuePair<string, string>>> options, int srcPos, List<KeyValuePair<string, string>> result)
    {
        if (result.Count == options.Count)
            WriteOne(result);
        else
        {
            foreach (KeyValuePair<string, string> opt in options[srcPos])
            {
                List<KeyValuePair<string, string>> theClone = new List<KeyValuePair<string, string>>(result); 
                theClone.Add(opt); 
                permutation(options, srcPos + 1, theClone);
            }
        }
    }

    private void WriteOne(List<KeyValuePair<string, string>> OneResult)
    {
        StringBuilder line = new StringBuilder(80);
        StringBuilder line2 = new StringBuilder(80);
        line.Append("|"); line2.Append("+");
        foreach (KeyValuePair<string, string> item in OneResult)
        {
            line.Append(" [");       line2.Append("--");
            line.Append(item.Key);   line2.Append(new string('-', item.Key.Length));
            line.Append(", ");       line2.Append("--");
            line.Append(item.Value); line2.Append(new string('-', item.Value.Length));
            line.Append("] |");     line2.Append("--+");
        }
        line.AppendLine(); line2.AppendLine();
        Console.WriteLine(line.ToString());
        Console.WriteLine(line2.ToString());
    }

谢谢,伙计,我会等着“所有这些清单都在我脑子里痛”哈哈,我知道这是什么感觉,我已经在上面呆了3个小时左右了。我在这里也尝试了一些不同的事情,但我已经到了我刚刚错开的地步。我今天就要离开了,但如果你能想出什么办法,我一定会在周一检查。干杯如果你投票支持我的解决方案,那么有一天我可能会发表评论!你是王者!我得稍微修改一下,这样才能符合我的实际情况,但这是应该的方式!非常感谢你,如果可以的话,我会投你两次票!埃里克·利珀特写了一篇可能对你有帮助的文章。
int elementAmount = list.Count;
int combinationAmount = list.Select(x => x.Count).Aggregate(1, (x, y) => x * y); //Multiply sublists element count

List<List<KeyValuePair<string, string>>> sortedList = new List<List<KeyValuePair<string, string>>>(combinationAmount);

for (int i = 0; i < combinationAmount; i++)
sortedList.Add(new List<KeyValuePair<string, string>>(elementAmount));

for (int j = 0; j < elementAmount; j++)
{
    for (int i = 0; i < combinationAmount; i++)
        sortedList[i].Add(list[j].Count > i ? list[j][i] : sortedList[i - list[j].Count][j]);
}
+---------------------------+---------------------------+---------------------------+
| ["Category 1", "Value A"] | ["Category 2", "Value C"] | ["Category 3", "Value E"] |
+---------------------------+---------------------------+---------------------------+
| ["Category 1", "Value B"] | ["Category 2", "Value D"] | ["Category 3", "Value E"] |
+---------------------------+---------------------------+---------------------------+
| ["Category 1", "Value A"] | ["Category 2", "Value C"] | ["Category 3", "Value E"] |
+---------------------------+---------------------------+---------------------------+
| ["Category 1", "Value B"] | ["Category 2", "Value D"] | ["Category 3", "Value E"] |
+---------------------------+---------------------------+---------------------------+
    private void button1_Click(object sender, EventArgs e)
    {
        List<List<KeyValuePair<string, string>>> list = new List<List<KeyValuePair<string, string>>>();

        list.Add(new List<KeyValuePair<string, string>>());
        list[0].Add(new KeyValuePair<string, string>("Category 1", "Value A"));
        list[0].Add(new KeyValuePair<string, string>("Category 1", "Value B"));

        list.Add(new List<KeyValuePair<string, string>>());
        list[1].Add(new KeyValuePair<string, string>("Category 2", "Value C"));
        list[1].Add(new KeyValuePair<string, string>("Category 2", "Value D"));

        list.Add(new List<KeyValuePair<string, string>>());
        list[2].Add(new KeyValuePair<string, string>("Category 3", "Value E"));

        List<List<KeyValuePair<string, string>>> sortedList = new List<List<KeyValuePair<string, string>>>();

        permutation(list, 0, new List<KeyValuePair<string, string>>());
    }


    private void permutation( List<List<KeyValuePair<string, string>>> options, int srcPos, List<KeyValuePair<string, string>> result)
    {
        if (result.Count == options.Count)
            WriteOne(result);
        else
        {
            foreach (KeyValuePair<string, string> opt in options[srcPos])
            {
                List<KeyValuePair<string, string>> theClone = new List<KeyValuePair<string, string>>(result); 
                theClone.Add(opt); 
                permutation(options, srcPos + 1, theClone);
            }
        }
    }

    private void WriteOne(List<KeyValuePair<string, string>> OneResult)
    {
        StringBuilder line = new StringBuilder(80);
        StringBuilder line2 = new StringBuilder(80);
        line.Append("|"); line2.Append("+");
        foreach (KeyValuePair<string, string> item in OneResult)
        {
            line.Append(" [");       line2.Append("--");
            line.Append(item.Key);   line2.Append(new string('-', item.Key.Length));
            line.Append(", ");       line2.Append("--");
            line.Append(item.Value); line2.Append(new string('-', item.Value.Length));
            line.Append("] |");     line2.Append("--+");
        }
        line.AppendLine(); line2.AppendLine();
        Console.WriteLine(line.ToString());
        Console.WriteLine(line2.ToString());
    }
    private void Test()
    {
        permutation(new string[] { "AB", "CD", "E" }, 0, "");
    }


    private void permutation(string[] options, int srcPos, string result)
    {
        if (result.Length == options.Length)
            Console.WriteLine(result);
        else
        {
            foreach (char opt in options[srcPos])
            {
                permutation(options, srcPos + 1, result + opt);
            }
        }
    }