我知道关于排列列表的问题有几个类似的措辞问题,但它们似乎并没有真正解决我正在寻找的问题.我知道有办法做到这一点,但我画了一个空白.我有一个类似于这种格式的平面文件:
Col1|Col2|Col3|Col4|Col5|Col6
a|b,c,d|e|f|g,h|i
. . .
Run Code Online (Sandbox Code Playgroud)
现在就是诀窍:我想创建这些行的所有可能排列的列表,其中行中以逗号分隔的列表表示可能的值.例如,我应该可以IEnumerable<string>将上面的代表表示为行:
IEnumerable<string> row = new string[] { "a", "b,c,d", "e", "f", "g,h", "i" };
IEnumerable<string> permutations = GetPermutations(row, delimiter: "/");
Run Code Online (Sandbox Code Playgroud)
这应该生成以下字符串数据集合:
a/b/e/f/g/i
a/b/e/f/h/i
a/c/e/f/g/i
a/c/e/f/h/i
a/d/e/f/g/i
a/d/e/f/h/i
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎优雅地适合递归方法,但显然我有一个星期一的坏情况,我不能完全围绕如何接近它.一些帮助将不胜感激.应该是GetPermutations(IEnumerable<string>, string)什么样的?
我真的认为这将是一个很棒的递归函数,但我最终没有那样写。最终,这是我创建的代码:
public IEnumerable<string> GetPermutations(IEnumerable<string> possibleCombos, string delimiter)
{
var permutations = new Dictionary<int, List<string>>();
var comboArray = possibleCombos.ToArray();
var splitCharArr = new char[] { ',' };
permutations[0] = new List<string>();
permutations[0].AddRange(
possibleCombos
.First()
.Split(splitCharArr)
.Where(x => !string.IsNullOrEmpty(x.Trim()))
.Select(x => x.Trim()));
for (int i = 1; i < comboArray.Length; i++)
{
permutations[i] = new List<string>();
foreach (var permutation in permutations[i - 1])
{
permutations[i].AddRange(
comboArray[i].Split(splitCharArr)
.Where(x => !string.IsNullOrEmpty(x.Trim()))
.Select(x => string.Format("{0}{1}{2}", permutation, delimiter, x.Trim()))
);
}
}
return permutations[permutations.Keys.Max()];
}
Run Code Online (Sandbox Code Playgroud)
...我的测试条件为我提供了我期望的输出:
IEnumerable<string> row = new string[] { "a", "b,c,d", "e", "f", "g,h", "i" };
IEnumerable<string> permutations = GetPermutations(row, delimiter: "/");
foreach(var permutation in permutations)
{
Debug.Print(permutation);
}
Run Code Online (Sandbox Code Playgroud)
这产生了以下输出:
a/b/e/f/g/i
a/b/e/f/h/i
a/c/e/f/g/i
a/c/e/f/h/i
a/d/e/f/g/i
a/d/e/f/h/i
Run Code Online (Sandbox Code Playgroud)
感谢大家的建议,他们确实帮助我理清了脑海中需要做的事情。我已经对你的所有答案投了赞成票。