C#のswitch-caseで複数の変数を条件に使用する

C#のswitchについてです。
次のようなenumがあるとします。

private enum Type1
{
    A,
    B,
    C,
}
private enum Type2
{
    D,
    E,
    F,
}

たまに下記のようなコードを見ます。

private void Sample1(Type1 type1, Type2 type2)
{
    if (type1 == Type1.A && type2 == Type2.D)
    {
        ...
    }
    else if (type1 == Type1.A && type2 == Type2.E)
    {
        ...
    }
    else if (...)
    ...
}

といったように、ふたつの変数の値の組み合わせの分だけ分岐があるケースです。
これをswitchで次のように書くものも見かけます。

private void Sample2(Type1 type1, Type2 type2)
{
    switch (type1)
    {
        case Type1.A:
            switch (type2)
            {
                case Type2.D:
                    ...
                    break;
                ...
            }
            break;
        case Type1.B:
            switch (type2)
            {
                ...
            }
            break;
        ...
    }
}

switchの入れ子ですね。
type2の似たようなswitchを複数箇所に書くことになるのでいまいちです。
そこで下記のようにtype1とtype2をまとめて書きます。

private void Sample3(Type1 type1, Type2 type2)
{
    switch ((type1, type2))
    {
        case (_, Type2.D):
            // type1によらず、type2がType2.Dの場合
            ...
            break;
        case (Type1.A, Type2.E):
            // type1がType1.A かつ type2がType2.E の場合
            ...
            break;
        case (Type1.C, _):
            // type1がType1.Cの場合
            ...
            break;
        default:
            // それ以外
            ...
            break;
    }
}

古いバージョンでは使えませんが、ふたつの変数の値の組み合わせをcaseで指定できます。

スポンサーリンク