Ниже приведен класс, который я использовал ранее для этой конкретной цели ... как следует из названия, он существенно учитывается в разных основах в зависимости от количества символов в предоставленном наборе символов. Надеюсь, это полезно ...
public class BaseNCounter
{
public char[] CharSet { get; set; }
public int Power { get; set; }
public BaseNCounter() { }
public IEnumerable<string> Count() {
long max = (long)Math.Pow((double)this.CharSet.Length, (double)this.Power);
long[] counts = new long[this.Power];
for(long i = 0; i < max; i++)
yield return IncrementArray(ref counts, i);
}
public string IncrementArray(ref long[] counts, long count) {
long temp = count;
for (int i = this.Power - 1; i >= 0 ; i--) {
long pow = (long)Math.Pow(this.CharSet.Length, i);
counts[i] = temp / pow;
temp = temp % pow;
}
StringBuilder sb = new StringBuilder();
foreach (int c in counts) sb.Insert(0, this.CharSet[c]);
return sb.ToString();
}
}
Вот несколько сценариев использования в консольном приложении.
class Program
{
static void Main(string[] args)
{
BaseNCounter c = new BaseNCounter() {
CharSet = new char [] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' },
Power = 2};
foreach(string cc in c.Count())
Console.Write("{0} ,", cc);
Console.WriteLine("");
BaseNCounter c2 = new BaseNCounter()
{
CharSet = new char[] { 'x', 'q', 'r', '9'},
Power = 3
};
foreach (string cc in c2.Count())
Console.Write("{0} ,", cc);
Console.Read();
}
}