何かと評判の良くない三項演算子の可能性についてちょっと試してみたのでメモ。
まずは典型的な三項演算子。
int age = 18;
Console.WriteLine(age < 20 ? "未成年です" : "成人です");
Console.WriteLine
行のかっこ内が三項演算子で、age
が20歳未満であれば未成年です
が表示され、20歳以上であれば成人です
が表示されます。
このように三項演算子は最初の式を評価してtrue
であれば:
の前の値が引き渡され、false
であれば後の値が引き渡されます。
マルかバツかのような、わざわざif文を書くほどでもないような簡単な処理に重宝します。
では、選択肢が2つ以上ある場合どうなるでしょうか。
普通はif文をたくさん書くか、switch文を書くことになります。
このようなテーブルデータを例に取ると。
id | item |
---|---|
0 | りんご |
1 | みかん |
2 | バナナ |
こんな感じのswitch文を書くことができます。
int fruitId = 0
switch (fruitId)
{
case 0:
Console.WriteLine("りんご");
break;
case 1:
Console.WriteLine("みかん");
break;
case 2:
Console.WriteLine("バナナ");
break;
default:
Console.WriteLine("不明です");
break;
}
これを三項演算子で書くとこうなります。
int fruitId = 0
Console.WriteLine(
fruitId == 0 ? "りんご"
: (fruitId == 1 ? "みかん"
: (fruitId == 2 ? "バナナ"
: "不明です")));
書けなくはないけど、めっちゃ怒られそうですね。
悪乗りしてもう一つ。
int month = 3;
Console.WriteLine(month > 0 && month < 4 ? "春です"
: (month < 7 ? "夏です"
: (month < 10 ? "秋です"
: (month < 13 ? "冬です"
: (month % 12 == 0 ? "たぶん冬"
: (month % 12 < 4 ? "たぶん春"
: (month % 12 < 7 ? "たぶん夏"
: (month % 12 < 10 ? "たぶん秋" : "たぶん冬")))))));
月を入れると季節が返ってくる三項演算子です。おまけで13月とかオーバーフローした場合でもちゃんと季節が返ってくるようにしました。