Generate String Combinations
string.Join(string, IEnumerable&lt;T&gt;)

Your method ArrayToString can be replaced with a single line :

public static string ArrayToString(int[] arr)
{
    return string.Join("", arr.Select(x =&gt; Chars[x]));
}


Your method PrintArray is never used but I assume it's just there for testing purpose.

Code style

Auto properties

You can use auto-properties to avoid explicitly creating a backing field for your variables :


private int _Length;

public int Length
{
    get
    {
        return _Length;
    }
}



Can be simplified to a single property :

public int Length { get; }


You can do the same for all of your properties.

Redundant this qualifier

You don't have to write this. everywhere e.g this.Range.Max as there are no variables with the same names there, the compiler will guess that you are referring to the container class.