C# 按预定义顺序将项目组合到列表中

C# 按预定义顺序将项目组合到列表中,c#,logic,C#,Logic,我的实际用例更复杂,涉及一个类,而不是字符串,但如果我能解决简化的示例,我应该能够利用它。然而,我不能使用依赖于识别字母或类似性质的解决方案 private void Example() { var permutations = new List<List<int>> { new List<int> { 0, 1, 2 }, // AB + C + D, ABC + D, ABCD new List<int

我的实际用例更复杂,涉及一个类,而不是字符串,但如果我能解决简化的示例,我应该能够利用它。然而,我不能使用依赖于识别字母或类似性质的解决方案

private void Example()
{
    var permutations = new List<List<int>>
    {
        new List<int> { 0, 1, 2 }, // AB + C + D, ABC + D, ABCD
        new List<int> { 0, 2, 1 }, // AB + C + D, AB + CD, ABCD
        new List<int> { 1, 0, 2 }, // A + BC + D, ABC + D, ABCD
        new List<int> { 1, 2, 0 }, // A + BC + D, A + BCD, ABCD
        new List<int> { 2, 0, 1 }, // A + B + CD, AB + CD, ABCD
        new List<int> { 2, 1, 0 }  // A + B + CD, A + BCD, ABCD
    };

    foreach (var permutation in permutations)
    {
        var variables = new List<string> { "A", "B", "C", "D" };
        int count = 0;

        foreach (var i in permutation)
        {
            variables[i - count] = variables[i - count] + variables[i - count + 1];
            variables.RemoveAt(i - count + 1);
            count++;
        }

        Console.WriteLine(variables.Single());
    }
}

你必须做几件事

索引不能小于0或大于列表的大小。 仅当i小于排列3的大小时,才增加计数。 解决方案


您可以合并并创建一个项目,但这会让您到达所需的位置。

您进行更新有什么原因吗?如果你只是创建另一个列表并复制原始列表中的内容,你的状态会更好。请你解释一下{0,1,2}如何转换为AB+C+D,ABC+D,ABCD@AnuViswan给出简化的示例,列表{A,B,C,D}对所有排列执行三个步骤,所有排列应在最后一步生成ABCD。对于置换{0,1,2},第一步结合A和B,第二步结合先前结合的AB和C,最后一步结合先前结合的ABC和D。@catbert它不需要就位。
// Fails on { 1, 0, 2}
if (i - count == 0)
    count++;

// Fails on { 1, 0, 2}
if (i - count + 1 < variables.Count)
    count++;
    var answers = new List<string>();

    foreach (var permutation in permutations)
    {
        var original = new List<string> { "A", "B", "C", "D" };
        var variables = original.ToList();
        var perm = new List<string>();
        int count = 0;
        foreach (var i in permutation)
        {
            int index = i - count < 0 ? 0 : i - count;
            variables[index] = variables[index] + variables[index + 1];
            variables.RemoveAt(index + 1);

            if (i < permutation.Count - 1) 
                count++;

            perm.Add(string.Join(" + ", variables));
        }
        answers.Add(string.Join(",", perm));
    }
answers
Count = 6
    [0]: "AB + C + D,ABC + D,ABCD"
    [1]: "AB + C + D,AB + CD,ABCD"
    [2]: "A + BC + D,ABC + D,ABCD"
    [3]: "A + BC + D,A + BCD,ABCD"
    [4]: "A + B + CD,AB + CD,ABCD"
    [5]: "A + B + CD,A + BCD,ABCD"