77

それ以外の

if (foo == "1" || foo == "5" || foo == "9" ... ) 

私は次のようにそれらを組み合わせるのが好きです(これは機能しません):

if (foo == ("1" || "5" || "9" ... ))

それは可能ですか?

4

8 に答える 8

169

残念ながらそうではありません。最善の策は、拡張メソッドを作成することです

public static bool IsOneOf<T>(this T value, params T[] options)
{
    return options.Contains(value);
}

次のように使用できます。

if (foo.IsOneOf("1", "5", "9"))
{
    ...
}

汎用であるため、任意の型 (int、string など) に使用できます。

于 2013-07-23T16:27:58.343 に答える
37

このようにすることはできません。代わりにこれを行うことができます:

string[] validValues = new string[] { "1", "5", "9", "whatever" };
if(validValues.Contains(foo))
{
    // do something
}
于 2013-07-23T16:25:28.887 に答える
25

1 つの可能なオプションは次のとおりです。

switch (foo)
{
    case "1":
    case "5":
    case "9":
        // your code here

        break;
}

別の可能なオプションは次のとおりです。

var vals = new string[] { "1", "5", "9" };
if (vals.Contains(foo))
{
    // your code here
}
于 2013-07-23T16:25:17.300 に答える
23

すべてのオプションが 1 文字だけの場合は、次のようにできます。

if ("159".IndexOf(foo) != -1)
{
  //do something
}
于 2013-07-23T16:31:33.750 に答える
18

ここにさらに別の選択肢があります:

bool x = new[] { "1", "5", "9" }.Any(a => a == "5"); //x == true
bool y = new[] { "1", "5", "9" }.Any(a => a == "8"); //y == false

.Contains(foo)ここではラムダの柔軟性がかなり無駄になるため、この場合に使用することをお勧めします。実行する必要がある複雑な式がある場合は、Any の方が便利です。

于 2013-07-23T16:28:46.257 に答える
13

許容できる場合は、これを行うことができます。

if ( (new string[] {"1","9","5","6" }).Contains(foo))
{

}
于 2013-07-23T16:25:24.280 に答える
9

複数の if 条件がある場合は、常に switch ステートメントを使用することを検討する必要があります。これは、コンパイラーが可能な限り Jumptables を作成て速度を上げるためです。速度テストについては、こちらをご覧ください。ここで注意すべきことは、条件の数がオーバーヘッドをカバーするのに十分な場合、C# コンパイラは HashTable オブジェクトも作成するということです。

したがって、これはより良いアプローチであり、

switch (foo) {
case "1":
case "5":
case "9":
    // ...
    break;
case "2":
case "4":
    // ...
    break;
}
于 2013-07-23T16:31:04.643 に答える
9

switch次のステートメントを使用できます。

switch (foo) {
    case "1":
    case "5":
    case "9":
        // ...
        break;
    case "2":
    case "4":
        // ...
        break;
}

が文字列の場合foo、大文字と小文字の区別に注意してください。

于 2013-07-23T16:25:32.477 に答える