なべひろBlog

プログラミングをメインに仕事に関するアレコレを発信しています。

C# switch式の使い方

Ver8から導入されたswitch式ですが、少し前まで存在が分かりませんでした。

使ってみたらとても便利に思いましたので、どんな手法で使えるか、幾つか試してみます。

単純なswitch式

単純に評価値を基に結果を出力します。

私の場合過去の事例を見ると、この手法が大半になりそうです。

Console.Write("数値を入力してください。 : ");
string name = Console.ReadLine();
// switch式
int answer = name switch
{
    "0" => 0,
    "1" => 1,
    _ => 2,
};
Console.Write($"あなたの入力から変換した値は{answer}です。");

例はコンソールアプリケーションで入力された文字列(数値)に対して該当する数値を出力するだけの簡単な動作です。

明確化された複数条件

出力に対して複数の条件が一致するパターンです。

Console.Write("数値を入力してください。 : ");
int result = int.Parse(Console.ReadLine());
// switch式
int answer = result switch
{
    1 or 2 => 0,
    3 or 4 => 1,
    _ =>2,
};
Console.Write($"あなたの入力から変換した値は{answer}です。");

入力が「1」または「2」の場合は0を出力し、入力が「3」または「4」の場合は1を出力します。

それ以外の場合は2を出力します。

範囲のある複数条件

条件に範囲を持たせる事も可能です。

Console.Write("数値を入力してください。 : ");
int result = int.Parse(Console.ReadLine());
// switch式
int answer = result switch
{
    int r when r < 2 => 0,
    _ => 1,
};
Console.Write($"あなたの入力から変換した値は{answer}です。");

入力が2より小さい場合は0を出力し、それ以外は1を出力します。

複数の値を参照する

複数の値を参照する手段も特に難しくありません。

タプルチックにして条件を定義すれば判定できます。

Console.Write("最初の数値を入力してください。 : ");
string value1 = Console.ReadLine();
Console.Write("最後の数値を入力してください。 : ");
string value2 = Console.ReadLine();
// switch式
int answer = (value1, value2) switch
{
    ("1", "1") => 1,
    ("2", "2") => 2,
    _ => 3,
};
Console.WriteLine($"あなたの入力から変換した値は{answer}です。");

2つの入力が共に「1」なら1を出力し、共に「2」なら2を出力、それ以外は全て3を出力します。

型の違う複数の値を参照する

複数の入力を参照する場合、それぞれの変数型が違っても問題ありません。

Console.Write("最初の数値を入力してください。 : ");
string value1 = Console.ReadLine();
Console.WriteLine("最後の数値を入力してください。 : ");
// switch式nt value2 = int.Parse(Console.ReadLine());
int answer = (value1, value2) switch
{
    ("1", 1) => 1,
    ("2", 2) => 2,
    _ => 3,
};
Console.WriteLine($"あなたの入力から変換した値は{answer}です。");

参照するのはstring型とint型ですが問題なく処理を行えます。

プロパティを参照する

このようなケースはあまりないかもしれませんが、こんなのも可能という例です。

// データが入るだけのClass
private class DataArray
{
    public int A { get; set; }
    public int B { get; set; }
    public string C { get; set; }
}
// コンストラクタ
public DataArray(int a, int b, string c)
{
    A = a;
    B = b;
    C = c;
}

上記のClassの値を参照する場合です。

Console.Write("数値Aの値を入力してください。 : ");
int a = int.Parse(Console.ReadLine());
Console.Write("数値Bの値を入力してください。 : ");
int b = int.Parse(Console.ReadLine());
Console.Write("文字列Cの値を入力してください。 : ");
string c = Console.ReadLine();
// 入力された値からインスタンス生成
DataArray data = new DataArray(a, b, c);
// switch式
int answer = data switch
{
    { A: 0 } => 0,
    { A: 1, B: 0 } => 1,
    { A: 1, B: 1, C: "a" } => 2,
    { A: 1, B: 1, C: "b" } => 3,
    _ => -1,
};
Console.Write($"あなたの入力から変換した値は{answer}です。");

{}の中で参照するプロパティと比較する値を記述します。

サンプルで示されたように比較対象にされてないプロパティは比較されず、記述された条件のみが比較対象となります。

switch式にメソッドを使う

switch式は変数だけではなく、戻り値がありswitch式の評価が可能であればメソッドでもかまいません。

// 引数を2乗して返すだけのメソッド
private static int changeValue(string s)
{
    return int.Parse(s) * int.Parse(s);
}

上記メソッドをswitch式評価で使用すると

Console.Write("最初の数値を入力してください。 : ");
string value1 = Console.ReadLine();
// switch式
int answer = changeValue(value1) switch
{
    2 => 4,
    4 => 8,
    _ => 16,
};
Console.WriteLine($"あなたの入力から変換した値は{answer}です。");

入力値を2乗してからswitch式で評価し出力します。

switch式の中でメソッドを使う

これも殆ど使用するケースはないかと思いますが参考までに

// 引数を2乗して返すだけのメソッド
private static int changeValue(string s)
{
    return int.Parse(s) * int.Parse(s);
}

上記のメソッドをswitch式の中で使用すると

Console.Write("最初の数値を入力してください。 : ");
int value1 = int.Parse(Console.ReadLine());
// switch式
int answer = value1 switch
{
    1 => changeValue("10"),
    2 => changeValue("100"),
    _ => changeValue("-1"),
};
Console.WriteLine($"あなたの入力から変換した値は{answer}です。");

最初に入力がswitch式で評価され、その値を基に実行されるメソッドが変わります。

if文でメソッドを使い分けるなどを行っていれば簡潔になるかもしれません。

switch式の中で正規表現を使う

こんな使い方もあまりないと思いますが、何ができるかを網羅するためにやってみました。

Console.Write("文字を入力してください : ");
string value = Console.ReadLine();
// switch式
string answer = value switch
{
    string v when Regex.IsMatch(v, "[a-z]") => "入力したのは小文字です",
    string v when Regex.IsMatch(v, "[A-Z]") => "入力したのは大文字です",
    string v when Regex.IsMatch(v, "[0-9]") => "入力したのは数字です",
    _ => "判別できない入力です",
};
Console.WriteLine($"あなたの入力した文字は{answer}です。");

他にもいろいろできると思いますので、どんな方法で何ができるかを把握しておけば多くの状況で使えるかもしれません。