[C#] switch caseで複数の条件を扱う方法
C#のswitch
文で複数の条件を扱う方法として、case
ラベルに複数の値をカンマで区切って指定することができます。
これにより、同じ処理を複数の条件で実行することが可能です。
例えば、case 1, 2, 3:
のように記述すると、変数が1、2、または3のいずれかの場合に同じ処理が実行されます。
また、C# 7.0以降ではwhen
キーワードを使って条件を追加することもできます。
これにより、より柔軟な条件分岐が可能になります。
switch文の基本構造
switch文とは
C#のswitch文は、特定の変数や式の値に基づいて、複数の分岐を実行するための制御構造です。
switch文を使用することで、複数の条件を簡潔に記述でき、コードの可読性を向上させることができます。
特に、同じ変数に対して複数の条件を評価する場合に便利です。
基本的なswitch文の書き方
switch文の基本的な構造は以下の通りです。
switch文は、評価する式と、それに続くcaseラベルで構成されます。
各caseラベルには、対応する処理が記述され、break文で終了します。
using System;
class Program
{
static void Main()
{
int number = 2; // 評価する変数
switch (number)
{
case 1:
Console.WriteLine("数値は1です。");
break; // case 1の処理を終了
case 2:
Console.WriteLine("数値は2です。");
break; // case 2の処理を終了
case 3:
Console.WriteLine("数値は3です。");
break; // case 3の処理を終了
default:
Console.WriteLine("数値は1から3の範囲外です。");
break; // defaultの処理を終了
}
}
}
数値は2です。
この例では、変数number
の値が2であるため、case 2のブロックが実行されます。
defaultブロックは、どのcaseにも該当しない場合に実行されます。
switch文とif文の違い
switch文とif文はどちらも条件分岐を行うための構造ですが、いくつかの違いがあります。
比較項目 | switch文 | if文 |
---|---|---|
使用場面 | 同じ変数に対する複数の値を評価する場合に適している | 複雑な条件式や異なる変数を評価する場合に適している |
可読性 | 条件が多い場合に可読性が高い | 条件が多いと可読性が低下する可能性がある |
パフォーマンス | コンパイラによって最適化されることが多い | 条件が多いとパフォーマンスが低下する可能性がある |
switch文は、特定の変数に対する複数の値を評価する際に、コードを簡潔に記述できるため、可読性が高くなります。
一方、if文は、より複雑な条件式や異なる変数を評価する場合に柔軟に対応できます。
複数の条件を扱う方法
C#のswitch文では、複数の条件を効率的に扱うことができます。
ここでは、複数のcaseラベルを使う方法、カンマで区切る方法、そしてwhenキーワードを使った条件追加について説明します。
複数のcaseラベルを使う
switch文では、同じ処理を複数のcaseラベルで共有することができます。
これにより、同じ処理を繰り返し記述する必要がなくなり、コードが簡潔になります。
using System;
class Program
{
static void Main()
{
int number = 1; // 評価する変数
switch (number)
{
case 1:
case 2:
case 3:
Console.WriteLine("数値は1から3のいずれかです。");
break; // case 1, 2, 3の処理を終了
default:
Console.WriteLine("数値は1から3の範囲外です。");
break; // defaultの処理を終了
}
}
}
数値は1から3のいずれかです。
この例では、number
が1、2、または3の場合に同じ処理が実行されます。
カンマで区切る方法
C# 7.0以降では、switch文でカンマを使って複数のcaseラベルを一行で記述することができます。
これにより、コードがさらに簡潔になります。
using System;
class Program
{
static void Main()
{
int number = 2; // 評価する変数
switch (number)
{
case 1:
case 2:
case 3:
Console.WriteLine("数値は1から3のいずれかです。");
break; // case 1, 2, 3の処理を終了
default:
Console.WriteLine("数値は1から3の範囲外です。");
break; // defaultの処理を終了
}
}
}
数値は1から3のいずれかです。
この例では、カンマを使って複数のcaseラベルを一行で記述しています。
whenキーワードを使った条件追加
C# 7.0以降では、whenキーワードを使ってcaseラベルに追加の条件を指定することができます。
これにより、より柔軟な条件分岐が可能になります。
using System;
class Program
{
static void Main()
{
int number = 5; // 評価する変数
switch (number)
{
case int n when (n > 0 && n < 10):
Console.WriteLine("数値は1から9の範囲内です。");
break; // when条件を満たす場合の処理を終了
default:
Console.WriteLine("数値は範囲外です。");
break; // defaultの処理を終了
}
}
}
数値は1から9の範囲内です。
この例では、whenキーワードを使って、number
が1から9の範囲内である場合に特定の処理を実行しています。
whenキーワードを使うことで、switch文においてより複雑な条件を扱うことができます。
実際のコード例
ここでは、switch文を使った具体的なコード例を紹介します。
単純な数値、文字列、列挙型を使った例をそれぞれ見ていきましょう。
単純な数値の例
数値を使ったswitch文の例です。
数値に基づいて異なるメッセージを表示します。
using System;
class Program
{
static void Main()
{
int dayOfWeek = 3; // 曜日を表す数値
switch (dayOfWeek)
{
case 1:
Console.WriteLine("今日は月曜日です。");
break; // case 1の処理を終了
case 2:
Console.WriteLine("今日は火曜日です。");
break; // case 2の処理を終了
case 3:
Console.WriteLine("今日は水曜日です。");
break; // case 3の処理を終了
default:
Console.WriteLine("無効な曜日です。");
break; // defaultの処理を終了
}
}
}
今日は水曜日です。
この例では、dayOfWeek
の値に応じて、対応する曜日のメッセージが表示されます。
文字列を使った例
文字列を使ったswitch文の例です。
文字列の値に基づいて異なるメッセージを表示します。
using System;
class Program
{
static void Main()
{
string fruit = "りんご"; // 評価する文字列
switch (fruit)
{
case "りんご":
Console.WriteLine("これはりんごです。");
break; // case "りんご"の処理を終了
case "バナナ":
Console.WriteLine("これはバナナです。");
break; // case "バナナ"の処理を終了
case "オレンジ":
Console.WriteLine("これはオレンジです。");
break; // case "オレンジ"の処理を終了
default:
Console.WriteLine("未知の果物です。");
break; // defaultの処理を終了
}
}
}
これはりんごです。
この例では、fruit
の値に応じて、対応する果物のメッセージが表示されます。
列挙型を使った例
列挙型を使ったswitch文の例です。
列挙型の値に基づいて異なるメッセージを表示します。
using System;
enum Season
{
Spring,
Summer,
Autumn,
Winter
}
class Program
{
static void Main()
{
Season currentSeason = Season.Autumn; // 現在の季節
switch (currentSeason)
{
case Season.Spring:
Console.WriteLine("春です。");
break; // case Season.Springの処理を終了
case Season.Summer:
Console.WriteLine("夏です。");
break; // case Season.Summerの処理を終了
case Season.Autumn:
Console.WriteLine("秋です。");
break; // case Season.Autumnの処理を終了
case Season.Winter:
Console.WriteLine("冬です。");
break; // case Season.Winterの処理を終了
}
}
}
秋です。
この例では、currentSeason
の値に応じて、対応する季節のメッセージが表示されます。
列挙型を使うことで、コードの可読性が向上し、誤入力を防ぐことができます。
応用例
switch文は、基本的な条件分岐だけでなく、応用的な使い方も可能です。
ここでは、複雑な条件分岐の実装、パターンマッチングとの組み合わせ、デフォルトケースの活用について説明します。
複雑な条件分岐の実装
switch文において、複雑な条件分岐を実装することができます。
特に、whenキーワードを使うことで、条件を細かく指定することが可能です。
using System;
class Program
{
static void Main()
{
int score = 85; // 評価するスコア
switch (score)
{
case int s when (s >= 90):
Console.WriteLine("評価: 優");
break; // 90以上のスコアの処理を終了
case int s when (s >= 75):
Console.WriteLine("評価: 良");
break; // 75以上90未満のスコアの処理を終了
case int s when (s >= 60):
Console.WriteLine("評価: 可");
break; // 60以上75未満のスコアの処理を終了
default:
Console.WriteLine("評価: 不可");
break; // 60未満のスコアの処理を終了
}
}
}
評価: 良
この例では、スコアに基づいて評価を行っています。
whenキーワードを使うことで、スコアの範囲に応じた評価を簡潔に記述できます。
パターンマッチングとの組み合わせ
C# 7.0以降では、switch文でパターンマッチングを使用することができます。
これにより、型や値に基づいた条件分岐が可能になります。
using System;
class Program
{
static void Main()
{
object obj = 42; // 評価するオブジェクト
switch (obj)
{
case int i:
Console.WriteLine($"整数: {i}");
break; // 整数の場合の処理を終了
case string s:
Console.WriteLine($"文字列: {s}");
break; // 文字列の場合の処理を終了
default:
Console.WriteLine("未知の型です。");
break; // その他の型の場合の処理を終了
}
}
}
整数: 42
この例では、obj
の型に基づいて異なる処理を行っています。
パターンマッチングを使うことで、型に応じた条件分岐が簡単に実装できます。
デフォルトケースの活用
switch文のデフォルトケースは、どのcaseにも該当しない場合に実行される処理を記述するために使用します。
デフォルトケースを活用することで、予期しない入力に対する処理を行うことができます。
using System;
class Program
{
static void Main()
{
string command = "終了"; // 評価するコマンド
switch (command)
{
case "開始":
Console.WriteLine("プログラムを開始します。");
break; // "開始"コマンドの処理を終了
case "停止":
Console.WriteLine("プログラムを停止します。");
break; // "停止"コマンドの処理を終了
default:
Console.WriteLine("無効なコマンドです。");
break; // 無効なコマンドの処理を終了
}
}
}
無効なコマンドです。
この例では、command
が”開始”や”停止”でない場合に、デフォルトケースが実行されます。
デフォルトケースを活用することで、予期しない入力に対するエラーハンドリングを行うことができます。
switch文のパフォーマンス
switch文は、条件分岐を効率的に行うための構造ですが、そのパフォーマンスはどのように評価されるのでしょうか。
ここでは、switch文の効率性、if文とのパフォーマンス比較、最適化のポイントについて説明します。
switch文の効率性
switch文は、特定の変数に対する複数の値を評価する際に、効率的な分岐を提供します。
コンパイラは、switch文を最適化して、ジャンプテーブルやバイナリサーチを使用することがあります。
これにより、特にcaseの数が多い場合に、switch文はif文よりも効率的に動作することがあります。
- ジャンプテーブル: caseラベルが連続した整数の場合、ジャンプテーブルを使用して定数時間で分岐を行います。
- バイナリサーチ: caseラベルが非連続の場合、バイナリサーチを使用して効率的に分岐を行います。
if文とのパフォーマンス比較
switch文とif文のパフォーマンスは、条件の数や内容によって異なります。
一般的に、switch文は以下のような場合にif文よりも効率的です。
- 条件が多い場合: switch文は、ジャンプテーブルやバイナリサーチを使用することで、条件が多い場合に効率的に動作します。
- 同じ変数を評価する場合: switch文は、同じ変数に対する複数の値を評価するのに適しています。
一方、if文は以下のような場合に適しています。
- 複雑な条件式: if文は、複雑な条件式や異なる変数を評価する場合に柔軟に対応できます。
- 少数の条件: 条件が少ない場合、if文の方がシンプルでわかりやすいことがあります。
最適化のポイント
switch文を使用する際の最適化のポイントをいくつか紹介します。
- caseラベルの順序: caseラベルを連続した整数にすることで、コンパイラがジャンプテーブルを使用しやすくなります。
- デフォルトケースの活用: デフォルトケースを適切に使用することで、予期しない入力に対するエラーハンドリングを効率的に行えます。
- whenキーワードの使用: whenキーワードを使って、条件を細かく指定することで、無駄な分岐を減らすことができます。
これらのポイントを考慮することで、switch文のパフォーマンスを最大限に引き出すことができます。
switch文は、適切に使用することで、コードの可読性と効率性を向上させる強力なツールです。
まとめ
この記事では、C#のswitch文を用いた複数の条件の扱い方について詳しく解説しました。
switch文の基本構造から、複数の条件を効率的に処理する方法、そして応用的な使い方までを具体的なコード例を交えて説明しました。
これを機に、実際のプログラミングにおいてswitch文を活用し、コードの可読性と効率性を向上させることを目指してみてください。