Подтвердить что ты не робот

Оценка выражений в операторах с коммутацией в С#

Я должен выполнить следующее в инструкции switch:

switch(num)
{
  case 4:
    // some code ;
    break;
  case 3:
    // some code ;
    break;
  case 0:
    // some code ;
    break;
  case < 0:
    // some code ;
    break;
}

Возможно ли, чтобы оператор switch оценил case < 0? Если нет, как я могу это сделать?

4b9b3361

Ответ 1

Вы не можете - switch/case - только для отдельных значений. Если вы хотите указать условия, вам нужно "if":

if (num < 0)
{
    ...
}
else
{
    switch(num)
    {
        case 0: // Code
        case 1: // Code
        case 2: // Code
        ...
    }
}

Ответ 2

Я знаю, что эта тема довольно старая, но если кто-то все еще ищет ответ в С# 7, это возможно. Вот пример:

switch (value)
{
     case var expression when value < 0:
         //some code
         break; 

     case var expression when (value >= 0 && value < 5):
         //some code
         break;

     default:
         //some code
         break;
}

Ответ 3

Вы можете сделать что-то подобное в конце вашего оператора switch:

default:
    if(num < 0)
    {
        ... // Code
    }
    break;

Ответ 4

Если ваше число не может быть меньше нуля:

public int GetSwitch(int num) { return num < 0 ? -1 : num; }
switch(GetSwitch(num))
{
case 4: // some code ; break;
case 3:// some code ; break;
case 0: // some code ; break;
case -1 :// some code ; break;
}

Если это возможно, используйте другое "несуществующее" число, такое как int.MinValue.

Ответ 5

вы можете сделать это

switch (mark)
        {
            case int n when n >= 80:
                Console.WriteLine("Grade is A");
                break;

            case int n when n >= 60:
                Console.WriteLine("Grade is B");
                break;

            case int n when n >= 40:
                Console.WriteLine("Grade is C");
                break;

            default:
                Console.WriteLine("Grade is D");
                break;
        }

Ответ 6

Вам нужно будет использовать, если хотите, хотите или нет. Коммутатор способен сравнивать ваше значение с постоянными значениями.

Ответ 7

Единственный способ, о котором я мог думать (и я действительно не рекомендую его), будет следующим:

int someValue;

switch (Math.Max(someValue, -1))
{
    case -1:
        // will be executed for everything lower than zero.
        break;

    case 0:
       // will be executed for value 0.
       break;

    case 1:
       // will be executed for value 1.
       break;

    default:
       // will be executed for anything else.
       break;
}

Ответ 8

Возможно также и наоборот (относящийся к ответу Джона Скита):

switch(num)
{
  case a:
      break;
  default:
      if( num < 0 )
      {}
   break;
}

Ответ 9

Что вы могли бы сделать, это использовать делегата, как это.

        var actionSwitch = new Dictionary<Func<int, bool>, Action>
        {
             { x => x < 0 ,     () => Log.Information("0")},
             { x => x == 1,     () => Log.Information("1")},
             { x => x == 2,     () => Log.Information("2")},
             { x => x == 3,     () => Log.Information("3")},
             { x => x == 4,     () => Log.Information("4")},
             { x => x == 5,     () => Log.Information("5")},
        };

        int numberToCheck = 1;

        //Used like this
        actionSwitch.FirstOrDefault(sw => sw.Key(numberToCheck)).Value();

Просто поменяйте местами то, что вы не хотите выполнять, где находится Log.Information("x"), и у вас есть выражение "switch".

Вам потребуется некоторая обработка ошибок, если вы проверите ключ, который "найден" Func.

Если вам нравится видеть версию коммутатора в Func, я только что написал пост в блоге с главой, посвященной примеру Switch.

Ответ 10

Вы не можете использовать сравнения в таких переключателях, как в VB, у вас есть 2 варианта, замените значение, которое вы включаете, с известным значением, и используйте это или - если вы имеете в виду все остальные случаи - вы можете использовать предложение по умолчанию:

switch(num)
{
  case 4:
    // some code ;
    break;
  case 3:
    // some code ;
    break;
  case 0:
    // some code ;
    break;
  default:
    // some code ;
    break;
}

Обратите внимание, что это не так, как вы просили: любые значения, отличные от 0,3,4, попадут в предложение deafult:.

Ответ 11

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

switch(0)
{
  case 0 when x < 0:
    ...
    break;
  case 0 when a > 5 && x == 0:
    ...
    break;
}

Использование фиктивных выражений ((0) в коммутаторе и case 0) абсолютно ужасно, и я не хотел бы, чтобы оно стало идиомой, но эй - оно краткое и очень ясное. Наверняка это не какой-то взлом, который полностью затеняет смысл и требует тайных знаний. Но С# преуспел бы, чтобы устранить потребность в этом. Мне бы хотелось, чтобы следующее было законным:

switch                   // maybe () here, if the grammar would demand
{
  case when x < 0:       // I like the case to stay
    ...
  case when a > 5 && x == 0:
    ...
}