C#のswitchについてです。
次のようなenumがあるとします。
1 2 3 4 5 6 7 8 9 10 11 12 | private enum Type1 { A, B, C, } private enum Type2 { D, E, F, } |
たまに下記のようなコードを見ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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で次のように書くものも見かけます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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をまとめて書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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で指定できます。