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

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

Я хочу использовать переключатель, но у меня есть много случаев, есть ли ярлык? Пока единственное решение, которое я знаю и попробовал, это:

switch (number)
{
case 1: something; break;
case 2: other thing; break;
...
case 9: .........; break;
}

Я надеюсь, что смогу сделать что-то вроде:

switch (number)
{
case (1 to 4): do the same for all of them; break;
case (5 to 9): again, same thing for these numbers; break;
}
4b9b3361

Ответ 1

Немного опоздал к игре по этому вопросу, но в последних изменениях, представленных в С# 7 (доступно по умолчанию в Visual Studio 2017/.NET Framework 4.6.2), переключение на основе диапазона теперь возможно с помощью оператора switch.

Пример:

int i = 63;

switch (i)
{
    case int n when (n >= 100):
        Console.WriteLine($"I am 100 or above: {n}");
        break;

    case int n when (n < 100 && n >= 50 ):
        Console.WriteLine($"I am between 99 and 50: {n}");
        break;

    case int n when (n < 50):
        Console.WriteLine($"I am less than 50: {n}");
        break;
}

Заметки:

  • Скобки ( и ) не обязательны в условии when, но используются в этом примере, чтобы выделить сравнение (я).
  • var также может использоваться вместо int. Например: case var n when n >= 100:

Ответ 2

Вот лучшее и элегантное решение для вашей задачи.

int mynumbercheck = 1000;
// Your number to be checked
var myswitch = new Dictionary <Func<int,bool>, Action>
            { 
             { x => x < 10 ,    () => //Do this!...  },  
             { x => x < 100 ,    () => //Do this!...  },
             { x => x < 1000 ,    () => //Do this!...  },
             { x => x < 10000 ,   () => //Do this!... } ,
             { x => x < 100000 ,  () => //Do this!... },
             { x => x < 1000000 ,  () => //Do this!... } 
            };

Теперь, чтобы позвонить нашему условному коммутатору

   myswitch.First(sw => sw.Key(mynumbercheck)).Value();

Альтернативный для Switch/ifElse

Ответ 3

If-else следует использовать в этом случае. Но если по какой-либо причине по-прежнему нужен коммутатор, вы можете сделать так, как показано ниже, первые случаи без разрыва будут распространяться до первого разрыва. Как и в предыдущих ответах, я рекомендую использовать переключатель if-else over.

switch (number){
            case 1:
            case 2:
            case 3:
            case 4: //do something;
                    break;
            case 5:
            case 6:
            case 7:
            case 8:
            case 9: //Do some other-thing;
                   break;
        }

Ответ 4

Интервал постоянный:

 int range = 5
 int newNumber = number / range;
 switch (newNumber)
 {
      case (0): //number 0 to 4
                break;
      case (1): //number 5 to 9
                break;
      case (2): //number 10 to 14
                break;
      default:  break;
 }

В противном случае:

  if else

Ответ 5

Вы могли бы иметь switch конструкцию "обрабатывать" диапазоны, используя ее вместе со List ваших границ.

List<int> bounds = new List<int>() {int.MinValue, 0, 4, 9, 17, 20, int.MaxValue };

switch (bounds.IndexOf(bounds.Last(x => x < j)))
{
    case 0: // <=0
        break;

    case 1: // >= 1 and <=4
        break;
    case 2: // >= 5 and <=9
        break;
    case 3: // >= 10 and <=17
        break;
    case 4: // >= 18 and <=20
        break;

    case 5: // >20
        break;
}

При таком подходе диапазоны могут иметь разные промежутки.

Ответ 6

Как уже упоминалось, if-else будет лучше в этом случае, когда вы будете обрабатывать диапазон:

if(number >= 1 && number <= 4)
{
   //do something;
}
else if(number >= 5 && number <= 9)
{
   //do something else;
}

Ответ 7

Я бы использовал троичные операторы, чтобы классифицировать ваши условия переключения.

Так...

switch( number > 9 ? "High" :
        number > 5 ? "Mid" :
        number > 1 ? "Low" : "Floor")
        {
              case "High":
                    do the thing;
                    break;
               case "Mid":
                    do the other thing;
                    break;
               case "Low":
                    do something else;
                    break;
               case "Floor":
                    do whatever;
                    break;
         }

Ответ 8

Только в .Net Visual Basic допускает диапазоны в операторах switch, но в С# для этого не существует синтаксиса.

Решение вашей конкретной проблемы в С#, я бы решил ее таким образом:

if(number >= 1 && number <= 9) // Guard statement
{
    if(number < 5)
    {
        // Case (1 to 4):

        //break;

    }
    else
    {
        // Case (5 to 9):

        //break;

    }

}
else
{
    // Default code goes here

    //break;

}

Чтобы проиллюстрировать это далее, представьте, что у вас есть процентное значение.

Используя вашу проблему в качестве шаблона, вы можете пожелать, чтобы это выглядело следующим образом:

switch (percentage)
{
    case (0 to 19):
        break;

    case (20 to 39):
        break;

    case (40 to 69):
        break;

    case (70 to 79):
        break;

    case (80 to 100):
        break;

    default:
        break;

}

Однако, поскольку С# не позволяет этот синтаксис, вот решение, которое позволяет С#:

if (percentage >= 0 && percentage <= 100) // Guard statement
{
    if (percentage >= 40)
    {
        if (percentage >= 80)
        {
            // Case (80% to 100%)

            //break;

        }
        else
        {
            if (percentage >= 70)
            {
                // Case (70% to 79%)

                //break;

            }
            else
            {
                // Case (40% to 69%)

                //break;

            }

        }

    }
    else
    {
        if (percentage >= 20)
        {
            // Case (20% to 39%)

            //break;

        }
        else
        {
            // Case (0% to 19%)

            //break;

        }

    }

}
else
{
    // Default code goes here

    //break;

}

Он может немного привыкнуть, но это прекрасно, когда вы его получите.

Лично я бы приветствовал операторы switch, чтобы разрешить диапазоны.

Будущее операторов switch С#

Вот некоторые идеи о том, как можно улучшить инструкции switch:

Версия A

switch(value)
{
    case (x => x >= 1 && x <= 4):
    break;

    case (x => x >= 5 && x <= 9):
    break;

    default:
    break;

}

Версия B

switch(param1, param2, ...)
{
    case (param1 >= 1 && param1 <= 4):
    break;

    case (param1 >= 5 && param1 <= 9 || param2 != param1):
    break;

    default:
    break;

}

Ответ 9

Если вы используете C/С++, синтаксиса "диапазон" нет. Вы можете только перечислить все значения после каждого сегмента "case". Language Ada или Pascal поддерживают синтаксис диапазона.

Ответ 10

Прежде всего, вы должны указать язык программирования, на который вы ссылаетесь. Во-вторых, операторы switch корректно используются для закрытых наборов опций относительно переключаемой переменной, например. перечисления или предопределенные строки. Для этого случая я бы предложил использовать старую старую структуру if-else.

Ответ 11

В С# переключатели представляют собой словари о том, что делать дальше. Поскольку вы не можете найти диапазон в словаре, лучшее, что вы можете сделать, - это случай, когда упомянуто высказывание Стива Гомеса.

Ответ 12

Через switch дело невозможно. Вы можете использовать вложенные операторы if.

if(number>=1 && number<=4){
//Do something
}else if(number>=5 && number<=9){
//Do something
}

Ответ 13

Если вопрос был о C (вы не сказали), тогда ответ будет отрицательным, но: GCC и Clang (возможно, другие) поддерживают range синтаксис, но он недействителен ISO C:

switch (number) {
    case 1 ... 4:
        // Do something.
        break;

    case 5 ... 9:
        // Do something else.
        break;
}

Обязательно наличие пробела до и после ..., иначе вы получите синтаксическую ошибку.

Ответ 14

Вы можете использовать операторы if-else с || операторы (или -операторы) вроде:

if(case1 == true || case2 == true || case3 == true)
   {
    Do this!... 
   }
else if(case4 == true || case5 == true || case6 == true)
   {
    Do this!... 
   }
else if(case7 == true || case8 == true || case9 == true)
   {
    Do this!... 
   }