Как совместить || операторы в выражении условия

Вместо

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

Мне нравится комбинировать их, похожие на следующие (что не работает):

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

Возможно ли это?

Ответ 1

К сожалению, нет, лучше всего создать метод расширения

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

и вы можете использовать его следующим образом:

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

Будучи универсальным, он может использоваться для любого типа (int, string и т.д.).

Ответ 2

Вы не можете этого сделать. Вместо этого вы можете сделать это:

string[] validValues = new string[] { "1", "5", "9", "whatever" };
if(validValues.Contains(foo))
{
    // do something
}

Ответ 3

Один из возможных вариантов:

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
}

Ответ 4

Если все параметры - это всего лишь один символ, вы можете сделать:

if ("159".IndexOf(foo) != -1)
{
  //do something
}

Ответ 5

Вот еще одна альтернатива:

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) в этом случае, так как гибкость лямбда здесь довольно пуста. Если бы было сложное выражение, которое нужно было сделать, любой был бы более полезен.

Ответ 6

Вы можете сделать это, если это приемлемо для вас:

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

}

Ответ 7

Вы можете использовать оператор switch:

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

Если foo - строка, обратите внимание на чувствительность к регистру.

Ответ 8

Если у вас есть несколько условий if, вы всегда должны учитывать использование операторов switch, поскольку компилятор создаст Jumptables, где можно увеличить скорость. Вы должны посмотреть здесь для проверки скорости. Здесь стоит отметить, что если количество условий достаточно велико для покрытия накладных расходов, С# -компилятор также создаст объект HashTable.

Итак, это лучший подход,

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