読者です 読者をやめる 読者になる 読者になる

C# で組み合わせ

C#

前提条件の説明がし辛いけど、10桁の文字列で、それぞれの桁に数字またはアルファベット、または*(意味的には、数字やアルファベットが設定されていない場合、としている)がいくつか選択肢として持っているとする。
このとき、全組み合わせを表示したい。

当然だけど、10桁全てをネストでループ回せばできる。
再帰を使えばすっきりかけるのではないか、と思ったが、再帰は難しくてよくわからない。
試行錯誤した結果、表示は出来るようにはなったがもっとよいやり方があるように思う。

class Program
{
    private static List<string> patterns = new List<string>();
    private static List<string>[] seed = new List<string>[10];

    static void Main(string[] args)
    {
        // テスト用の値設定
        seed[0] = new List<string> { "*" };
        seed[1] = new List<string>() { "1", "2", "3" };
        seed[2] = new List<string>() { "4", "5" };
        for (var i = 3; i < 7; i ++)
            seed[i] = new List<string> { "*" };
        seed[7] = new List<string>() { "6", "7", "8" };
        seed[8] = new List<string> { "*" };
        seed[9] = new List<string>() { "9", "0" };

        SetPattern();

        foreach (var pattern in patterns)
            Console.WriteLine(pattern);
    }

    public static void SetPattern(int key = 0, string pattern = "")
    {
        foreach (var val in seed[key])
        {
            if (key < seed.Length - 1)
                SetPattern(key + 1, pattern + val);
            else
                patterns.Add(pattern + val);
        }
    }
}

結果は以下。

*14****6*9
*14****6*0
*14****7*9
*14****7*0
*14****8*9
*14****8*0
*15****6*9
*15****6*0
*15****7*9
*15****7*0
*15****8*9
*15****8*0
*24****6*9
*24****6*0
*24****7*9
*24****7*0
*24****8*9
*24****8*0
*25****6*9
*25****6*0
*25****7*9
*25****7*0
*25****8*9
*25****8*0
*34****6*9
*34****6*0
*34****7*9
*34****7*0
*34****8*9
*34****8*0
*35****6*9
*35****6*0
*35****7*9
*35****7*0
*35****8*9
*35****8*0