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"