それ以外の
if (foo == "1" || foo == "5" || foo == "9" ... )
私は次のようにそれらを組み合わせるのが好きです(これは機能しません):
if (foo == ("1" || "5" || "9" ... ))
それは可能ですか?
残念ながらそうではありません。最善の策は、拡張メソッドを作成することです
public static bool IsOneOf<T>(this T value, params T[] options)
{
return options.Contains(value);
}
次のように使用できます。
if (foo.IsOneOf("1", "5", "9"))
{
...
}
汎用であるため、任意の型 (int、string など) に使用できます。
このようにすることはできません。代わりにこれを行うことができます:
string[] validValues = new string[] { "1", "5", "9", "whatever" };
if(validValues.Contains(foo))
{
// do something
}
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
}
すべてのオプションが 1 文字だけの場合は、次のようにできます。
if ("159".IndexOf(foo) != -1)
{
//do something
}
ここにさらに別の選択肢があります:
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 の方が便利です。
許容できる場合は、これを行うことができます。
if ( (new string[] {"1","9","5","6" }).Contains(foo))
{
}
複数の if 条件がある場合は、常に switch ステートメントを使用することを検討する必要があります。これは、コンパイラーが可能な限り Jumptables を作成して速度を上げるためです。速度テストについては、こちらをご覧ください。ここで注意すべきことは、条件の数がオーバーヘッドをカバーするのに十分な場合、C# コンパイラは HashTable オブジェクトも作成するということです。
したがって、これはより良いアプローチであり、
switch (foo) {
case "1":
case "5":
case "9":
// ...
break;
case "2":
case "4":
// ...
break;
}
switch
次のステートメントを使用できます。
switch (foo) {
case "1":
case "5":
case "9":
// ...
break;
case "2":
case "4":
// ...
break;
}
が文字列の場合foo
、大文字と小文字の区別に注意してください。