【C#】switch式でのパターンマッチング活用(型・プロパティ・論理パターン)

C# 8.0 以降では switch 文に加えて switch 式が導入され、より簡潔に条件分岐を記述できるようになりました。さらに C# 9.0 以降ではパターンマッチングが強化され、型・プロパティ・論理演算を組み合わせた柔軟な記述が可能です。本記事では switch 式でのパターンマッチング活用方法を紹介します。

基本的なswitch式

従来の switch 文と比べて、式として値を返せるのが特徴です。

int day = 2;

string result = day switch
{
    0 => "日曜日",
    1 => "月曜日",
    2 => "火曜日",
    _ => "不明"
};

Console.WriteLine(result); // 火曜日

型パターン

オブジェクトの型ごとに条件を分岐し、キャスト済みの変数をそのまま利用できます。

object obj = "Hello";

string desc = obj switch
{
    int i => $"整数: {i}",
    string s => $"文字列: {s}",
    null => "null値",
    _ => "その他"
};

Console.WriteLine(desc); // 文字列: Hello

プロパティパターン

オブジェクトのプロパティを使って条件分岐が可能です。オブジェクトの構造をそのまま条件として記述できます。

public class Person
{
    public string Name { get; set; } = "";
    public int Age { get; set; }
}

var person = new Person { Name = "Taro", Age = 20 };

string category = person switch
{
    { Age: < 13 } => "子供",
    { Age: >= 13 and < 20 } => "ティーン",
    { Age: >= 20 } => "大人",
    _ => "不明"
};

Console.WriteLine(category); // 大人

論理パターン

andornot を使うことで条件を論理的に組み合わせられます。

int number = 15;

string range = number switch
{
    >= 1 and <= 10 => "1〜10の範囲",
    > 10 and <= 20 => "11〜20の範囲",
    not 100 => "100以外",
    _ => "その他"
};

Console.WriteLine(range); // 11〜20の範囲

複合例:型+プロパティ+論理パターン

複数のパターンを組み合わせることで、複雑な条件も簡潔に書けます。

object obj = new Person { Name = "Hanako", Age = 17 };

string result = obj switch
{
    Person { Age: < 13 } => "子供",
    Person { Age: >= 13 and < 20 } => "ティーン",
    string s when s.Length > 5 => $"長い文字列: {s}",
    _ => "その他"
};

Console.WriteLine(result); // ティーン

まとめ

switch 式とパターンマッチングを活用することで、条件分岐を簡潔かつ表現力豊かに記述できます。

  • 型パターン … 型ごとの分岐とキャストを自動で行える
  • プロパティパターン … オブジェクトの中身で条件分岐可能
  • 論理パターン … and / or / not を組み合わせて柔軟な条件を記述

C# 9 以降のモダンな構文を取り入れることで、可読性と保守性の高いコードが実現できます。