您需要从一组有效字符中生成所有字符组合;我们称之为 set validChars
。基本上,每组长度为 N 的组合是其validChars
自身 N 次的笛卡尔积。使用 Linq 很容易做到这一点:
char[] validChars = ...;
var combinationsOfLength1 =
from c1 in validChars
select new[] { c1 };
var combinationsOfLength2 =
from c1 in validChars
from c2 in validChars
select new[] { c1, c2 };
...
var combinationsOfLength12 =
from c1 in validChars
from c2 in validChars
...
from c12 in validChars
select new[] { c1, c2 ... c12 };
var allCombinations =
combinationsOfLength1
.Concat(combinationsOfLength2)
...
.Concat(combinationsOfLength12);
显然,您不想为每个长度手动编写代码,特别是如果您事先不知道最大长度...
Eric Lippert 有一篇关于生成任意数量序列的笛卡尔积的文章。使用CartesianProduct
文章提供的扩展方法,可以生成长度为N的所有组合如下:
var combinationsOfLengthN = Enumerable.Repeat(validChars, N).CartesianProduct();
由于您想要从长度 1 到 MAX 的所有组合,您可以执行以下操作:
var allCombinations =
Enumerable
.Range(1, MAX)
.SelectMany(N => Enumerable.Repeat(validChars, N).CartesianProduct());
allCombinations
是一个IEnumerable<IEnumerable<char>>
,如果你想得到一个字符串序列的结果,你只需要添加一个投影:
var allCombinations =
Enumerable
.Range(1, MAX)
.SelectMany(N => Enumerable.Repeat(validChars, N).CartesianProduct())
.Select(combination => new string(combination.ToArray()));
请注意,它当然不是最有效的解决方案,但至少它简短易读......