列出不同字符组合的排列

我找到的最接近的SO主题是: 列出字符串/整数的所有排列

但是,如何为字符串中的每个位置使用不同的字符集?

例如:我指定字符串长度为“3”。 前两个位置应该是“a”或“b”,但最后一个位置应该是“1”或“2”,例如:

aa1 ba1 ab1 bb1 aa2 ab2 ba2 bb2 

使用此代码:

 public static List GenerateCombinations(char[][] characters) { var combinations = new List(); GenerateCombinations(0, characters, new char[characters.GetLength(0)], combinations); return combinations; } private static void GenerateCombinations(int level, char[][] characters, char[] current, List combinations) { if (level == characters.GetLength(0)) { combinations.Add(new string(current)); return; } foreach (var character in characters[level]) { current[level] = character; GenerateCombinations(level + 1, characters, current, combinations); } } 

使用它的例子:

 public static void Main() { var characters = new[] { new[] { 'a', 'b' }, new[] { 'a', 'b' }, new[] { '1', '2' } }; var combinations = GenerateCombinations(characters); foreach (var combination in combinations) { Console.WriteLine(combination); } } 

输出:

 aa1 aa2 ab1 ab2 ba1 ba2 bb1 bb2 

如果长度是固定的,您可以使用这个创建笛卡尔积的简单查询:

 string chars = "ab"; int[] digits = { 1, 2 }; var query = from c1 in chars from c2 in chars from d1 in digits select string.Format("{0}{1}{2}", c1, c2, d1); string[] possibleCombinations = query.ToArray(); 

结果:

 aa1 aa2 ab1 ab2 ba1 ba2 bb1 bb2 

编辑 :对于它的价值,lambda按要求(查询语法更易读):

 possibleCombinations = chars .SelectMany(c1 => chars .SelectMany(c2 => digits .Select(d1 => string.Format("{0}{1}{2}", c1, c2, d1)))) .ToArray(); 

如果你需要一种处理动态长度的方法,你可以看一下:

动态生成数组索引的所有可能组合