Вам необходимо сгенерировать все комбинации символов из набора допустимых символов; давайте назовем этот набор 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);
Очевидно, что вы не хотите вручную писать код для каждой длины, особенно если вы не знаете заранее максимальную длину ...
У Эрика Липперта есть статья о генерации декартового произведения из произвольного числа последовательностей. Используя метод расширения CartesianProduct
, предоставленный в статье, вы можете сгенерировать все комбинации длины N следующим образом:
var combinationsOfLengthN = Enumerable.Repeat(validChars, N).CartesianProduct();
Поскольку вы хотите, чтобы все комбинации имели длину от 1 до МАКС, вы можете сделать что-то подобное:
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()));
Обратите внимание, что это, конечно, не самое эффективное решение, но, по крайней мере, оно короткое и удобочитаемое ...