【C#】複数のORをまとめて書けないか

ある変数の値が、複数の値のうち「いずれかに一致する」かどうかを判定したいとき、ORを使用して書くと冗長になります。他に何か良い書き方は無いのでしょうか。

単純にORで書くと

ベタにif文でORを使用して書くと下記のようになります。

if (str == "apple" || str == "orange" || str == "banana")
{

    // 何か処理
}

“str == “の記述が複数回登場して冗長になります。

シンプルですが条件が増えるほど可読性がイマイチになっていく気がします。

switch文で書く場合

switch文で書く場合です。

switch (str)
{
    case "apple":
    case "orange":
    case "banana":
        // 何か処理
        break;
    default:
        break;
}

if文と比べて冗長さがありません。

処理を記述する箇所のネストが深くなってしまうのが微妙です。

caseの後ろに1行で複数の条件(ラベル)を記述できないのも残念です。

配列のContainsメソッドを使用して書く場合

配列のContains拡張メソッドを使用して書く場合です。

if (new string[] { "apple", "orange" , "banana" }.Contains(str))
{
    // 何か処理
}

条件となる値をまとめて記述できるのが良いです。

わざわざ配列を作成するのは微妙な気がします。また、ターゲットの変数が後ろに来るため、読みづらく感じます。

【番外】C# 9.0の新機能 パターンマッチングの拡張機能

私は実際に試していないのですが、C# 9.0の新機能 パターンマッチングの拡張機能によって条件式をシンプルに書けそうな気がします。

ORパターンというもので下記のような書き方ができるらしいです。

if (i is 2 or 3 or 5 or >= 10)
{
}

参考:C# 9.0 で条件式が革命を起こす

おすすめの書き方はswitch文

SQLのIN句のような書き方ができればそれが一番なのですが、出来そうにありません。

紹介した中で私のおすすめの書き方はswitch文を使用する方法です。冗長さが無いのと可読性の観点からの評価です。

単純にORを使用して記述する方法は、条件式が大量になると読みづらくなりますが、条件式が2、3個ならば良いかなと思います。

タイトルとURLをコピーしました