[C#] switch文での比較演算子の活用法

C#のswitch文は通常、特定の値に基づいて分岐を行いますが、C# 7.0以降では「パターンマッチング」を利用して比較演算子を活用できます。

これにより、switch文内で条件を柔軟に設定できます。

たとえば、数値の範囲に基づいて処理を分岐させることが可能です。

以下のように、caseラベルでwhenキーワードを使って条件を指定します。

例として、case int n when n > 0:のように記述することで、正の整数に対する処理を定義できます。

これにより、switch文の表現力が大幅に向上します。

この記事でわかること
  • switch文で比較演算子を使用する方法とその利点
  • whenキーワードを用いた条件分岐の実装例
  • 数値や文字列を用いた実践的な条件分岐の例
  • 複数条件やオブジェクトのプロパティを使った応用例
  • 列挙型とswitch文を組み合わせた条件分岐の方法

目次から探す

switch文での比較演算子の活用

C#のswitch文は、特定の値に基づいてコードの実行を分岐させるための便利な構文です。

通常、switch文は整数や文字列の値に対して使用されますが、C# 7.0以降では、比較演算子を用いたより柔軟な条件分岐が可能になりました。

ここでは、switch文での比較演算子の活用法について詳しく解説します。

比較演算子を使ったswitch文の書き方

C# 7.0以降では、switch文においてwhenキーワードを使用することで、条件に基づいた分岐を行うことができます。

以下に基本的な書き方を示します。

using System;
class Program
{
    static void Main()
    {
        int number = 15; // 比較する数値
        switch (number)
        {
            case int n when n < 10:
                Console.WriteLine("10未満です");
                break;
            case int n when n >= 10 && n < 20:
                Console.WriteLine("10以上20未満です");
                break;
            default:
                Console.WriteLine("20以上です");
                break;
        }
    }
}
10以上20未満です

この例では、numberの値に基づいて、異なるメッセージを表示します。

whenキーワードを用いることで、より複雑な条件をswitch文内で扱うことができます。

whenキーワードの使い方

whenキーワードは、switch文の各ケースに追加の条件を指定するために使用されます。

これにより、単純な値の一致だけでなく、条件に基づいた分岐が可能になります。

using System;
class Program
{
    static void Main()
    {
        int age = 25; // 年齢
        switch (age)
        {
            case int a when a < 18:
                Console.WriteLine("未成年です");
                break;
            case int a when a >= 18 && a < 65:
                Console.WriteLine("成人です");
                break;
            case int a when a >= 65:
                Console.WriteLine("高齢者です");
                break;
        }
    }
}
成人です

この例では、ageの値に基づいて、年齢層に応じたメッセージを表示します。

whenキーワードを使うことで、switch文の柔軟性が大幅に向上します。

数値の範囲を扱う例

switch文を使用して数値の範囲を扱うことも可能です。

以下の例では、数値が特定の範囲にあるかどうかを判定します。

using System;
class Program
{
    static void Main()
    {
        int score = 75; // スコア
        switch (score)
        {
            case int s when s >= 90:
                Console.WriteLine("優秀です");
                break;
            case int s when s >= 70:
                Console.WriteLine("良いです");
                break;
            case int s when s >= 50:
                Console.WriteLine("普通です");
                break;
            default:
                Console.WriteLine("改善が必要です");
                break;
        }
    }
}
良いです

この例では、scoreの値に基づいて、評価を表示します。

数値の範囲を指定することで、switch文を使った柔軟な条件分岐が可能になります。

文字列の比較を行う例

switch文は文字列の比較にも使用できます。

以下の例では、文字列の内容に基づいて異なるメッセージを表示します。

using System;
class Program
{
    static void Main()
    {
        string status = "完了"; // ステータス
        switch (status)
        {
            case string s when s == "開始":
                Console.WriteLine("プロセスが開始されました");
                break;
            case string s when s == "進行中":
                Console.WriteLine("プロセスが進行中です");
                break;
            case string s when s == "完了":
                Console.WriteLine("プロセスが完了しました");
                break;
            default:
                Console.WriteLine("不明なステータスです");
                break;
        }
    }
}
プロセスが完了しました

この例では、statusの値に基づいて、プロセスの状態を表示します。

文字列の比較を行うことで、switch文を使った条件分岐がさらに多様化します。

実践例

switch文を用いた比較演算子の活用法を理解したところで、実際のプログラムでどのように応用できるかを見ていきましょう。

ここでは、年齢、温度、スコアに基づく実践的な例を紹介します。

年齢に基づくカテゴリ分け

年齢に基づいて、個人を異なるカテゴリに分類するプログラムを作成します。

以下の例では、年齢に応じて「子供」、「青年」、「成人」、「高齢者」に分類します。

using System;
class Program
{
    static void Main()
    {
        int age = 30; // 年齢
        switch (age)
        {
            case int a when a < 13:
                Console.WriteLine("子供");
                break;
            case int a when a >= 13 && a < 20:
                Console.WriteLine("青年");
                break;
            case int a when a >= 20 && a < 65:
                Console.WriteLine("成人");
                break;
            case int a when a >= 65:
                Console.WriteLine("高齢者");
                break;
        }
    }
}
成人

このプログラムでは、ageの値に基づいて、年齢カテゴリを判定し、適切なメッセージを表示します。

温度に基づく警告メッセージ

温度に基づいて、異なる警告メッセージを表示するプログラムを作成します。

以下の例では、温度に応じて「低温注意」、「通常」、「高温注意」のメッセージを表示します。

using System;
class Program
{
    static void Main()
    {
        int temperature = 35; // 温度
        switch (temperature)
        {
            case int t when t < 0:
                Console.WriteLine("低温注意");
                break;
            case int t when t >= 0 && t <= 30:
                Console.WriteLine("通常");
                break;
            case int t when t > 30:
                Console.WriteLine("高温注意");
                break;
        }
    }
}
高温注意

このプログラムでは、temperatureの値に基づいて、温度に応じた警告メッセージを表示します。

スコアに基づく評価

スコアに基づいて、異なる評価を行うプログラムを作成します。

以下の例では、スコアに応じて「不合格」、「合格」、「優秀」の評価を行います。

using System;
class Program
{
    static void Main()
    {
        int score = 85; // スコア
        switch (score)
        {
            case int s when s < 50:
                Console.WriteLine("不合格");
                break;
            case int s when s >= 50 && s < 80:
                Console.WriteLine("合格");
                break;
            case int s when s >= 80:
                Console.WriteLine("優秀");
                break;
        }
    }
}
優秀

このプログラムでは、scoreの値に基づいて、スコアに応じた評価を表示します。

switch文を用いることで、条件に基づいた評価を簡潔に記述できます。

応用例

switch文における比較演算子の活用は、基本的な条件分岐だけでなく、より複雑な条件を扱うことも可能です。

ここでは、複数条件の組み合わせやオブジェクトのプロパティを使った条件分岐、列挙型との組み合わせについて解説します。

複数条件の組み合わせ

複数の条件を組み合わせて、より複雑なロジックを実装することができます。

以下の例では、年齢と職業に基づいて異なるメッセージを表示します。

using System;
class Program
{
    static void Main()
    {
        int age = 30; // 年齢
        string occupation = "学生"; // 職業
        switch (age)
        {
            case int a when a < 18 && occupation == "学生":
                Console.WriteLine("未成年の学生です");
                break;
            case int a when a >= 18 && occupation == "学生":
                Console.WriteLine("成人の学生です");
                break;
            case int a when a >= 18 && occupation == "社会人":
                Console.WriteLine("成人の社会人です");
                break;
            default:
                Console.WriteLine("その他のカテゴリです");
                break;
        }
    }
}
成人の学生です

このプログラムでは、ageoccupationの両方の条件に基づいて、適切なメッセージを表示します。

オブジェクトのプロパティを使った条件分岐

オブジェクトのプロパティを用いて条件分岐を行うことも可能です。

以下の例では、Personオブジェクトのプロパティに基づいてメッセージを表示します。

using System;
class Person
{
    public int Age { get; set; } // 年齢
    public string Name { get; set; } // 名前
}
class Program
{
    static void Main()
    {
        Person person = new Person { Age = 45, Name = "田中" }; // Personオブジェクトの作成
        switch (person)
        {
            case Person p when p.Age < 18:
                Console.WriteLine($"{p.Name}さんは未成年です");
                break;
            case Person p when p.Age >= 18 && p.Age < 65:
                Console.WriteLine($"{p.Name}さんは成人です");
                break;
            case Person p when p.Age >= 65:
                Console.WriteLine($"{p.Name}さんは高齢者です");
                break;
        }
    }
}
田中さんは成人です

このプログラムでは、PersonオブジェクトのAgeプロパティに基づいて、年齢に応じたメッセージを表示します。

列挙型とswitch文の組み合わせ

列挙型を用いることで、コードの可読性を向上させることができます。

以下の例では、列挙型DayOfWeekを用いて、曜日に応じたメッセージを表示します。

using System;
enum DayOfWeek
{
    日曜日,
    月曜日,
    火曜日,
    水曜日,
    木曜日,
    金曜日,
    土曜日
}
class Program
{
    static void Main()
    {
        DayOfWeek today = DayOfWeek.水曜日; // 今日の曜日
        switch (today)
        {
            case DayOfWeek.日曜日:
            case DayOfWeek.土曜日:
                Console.WriteLine("週末です");
                break;
            case DayOfWeek.月曜日:
            case DayOfWeek.火曜日:
            case DayOfWeek.水曜日:
            case DayOfWeek.木曜日:
            case DayOfWeek.金曜日:
                Console.WriteLine("平日です");
                break;
        }
    }
}
平日です

このプログラムでは、DayOfWeek列挙型を用いて、曜日に応じたメッセージを表示します。

列挙型を使用することで、コードの意図が明確になり、保守性が向上します。

よくある質問

switch文でのパフォーマンスはどうですか?

switch文は、特に整数や列挙型の値を扱う場合に、if-else文よりも効率的に動作することが多いです。

コンパイラは、switch文を最適化してハッシュテーブルやジャンプテーブルを使用することができるため、条件が多い場合でも高速に評価できます。

ただし、文字列や複雑な条件を扱う場合は、if-else文と同様のパフォーマンスになることがあります。

最適なパフォーマンスを得るためには、条件の数や種類に応じて適切な構文を選択することが重要です。

比較演算子を使う際の注意点は?

比較演算子をswitch文で使用する際には、以下の点に注意が必要です。

  • 条件の順序: 条件は上から順に評価されるため、より具体的な条件を先に記述することが重要です。

例えば、n < 10n < 20の条件がある場合、n < 10を先に記述しないと意図した動作にならないことがあります。

  • 型の一致: 比較する値の型が一致していることを確認してください。

型が異なると、意図しない動作を引き起こす可能性があります。

  • 範囲外の値: switch文で扱う値が想定外の範囲にある場合、defaultケースを用意しておくと安全です。

パターンマッチングを使うべき場面は?

パターンマッチングは、switch文をより強力にする機能で、特に以下の場面で有用です。

  • 複雑な条件分岐: 複数の条件を組み合わせて評価する場合、パターンマッチングを使うことでコードが簡潔になります。
  • 型の判定: オブジェクトの型に基づいて処理を分岐させる場合、パターンマッチングを使うと型チェックとキャストを同時に行うことができます。
  • オブジェクトのプロパティを使った分岐: オブジェクトのプロパティに基づいて条件分岐を行う場合、パターンマッチングを使うとコードが読みやすくなります。

パターンマッチングを使うことで、switch文の柔軟性と可読性が向上し、より複雑なロジックを簡潔に表現することができます。

まとめ

この記事では、C#のswitch文における比較演算子の活用法について、基本的な書き方から実践的な応用例までを詳しく解説しました。

switch文を用いることで、条件分岐を簡潔かつ効率的に記述できることがわかります。

これを機に、実際のプログラムでswitch文を活用し、より柔軟で読みやすいコードを書くことに挑戦してみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • 条件分岐 (10)
  • 繰り返し文 (10)
  • URLをコピーしました!
目次から探す