Несколько случаев в выражении switch

Или через прямой доступ к строке :

$string[strlen($string)-1];

Обратите внимание, что это не работает для многобайтовых строк. Если вам нужно работать с многобайтовой строкой, рассмотрите возможность использования семейства функций mb_*.

С PHP 7.1.0 также поддерживаются отрицательные числовые индексы, например, просто $string[-1];

534
задан Bugs 30 November 2017 в 09:37
поделиться

9 ответов

Нет никакого синтаксиса в C++, ни C# для второго метода, который Вы упомянули.

нет ничего неправильно с Вашим первым методом. Если однако у Вас есть очень большие диапазоны, просто используйте серию если операторы.

291
ответ дан Brian R. Bondy 30 November 2017 в 09:37
поделиться

gcc реализует расширение языка C для поддержки последовательных диапазонов:

switch (value)
{
   case 1...3:
      //Do Something
      break;
   case 4...6:
      //Do Something
      break;
   default:
      //Do the Default
      break;
}

Редактирование : Просто замеченный C# наклеивают вопрос, поэтому по-видимому, ответ gcc не помогает.

5
ответ дан DGentry 30 November 2017 в 09:37
поделиться

Один менее известный фасет переключатель в C# - то, что это полагается оператор = и так как это может быть переопределено, у Вас могло быть что-то вроде этого:


string s = foo();

switch (s) {
  case "abc": /*...*/ break;
  case "def": /*...*/ break;
}
5
ответ дан Cyber Oliveira 30 November 2017 в 09:37
поделиться

Другая опция состояла бы в том, чтобы использовать стандартную программу. Если случаи 1-3 все выполняются, та же логика тогда обертывают ту логику в стандартную программу и называют его для каждого случая. Я знаю, что это на самом деле не избавляется от операторов выбора, но это действительно реализует хороший стиль и сводит обслуживание к минимуму.....

[Редактирование] Добавленная альтернативная реализация для соответствия исходному вопросу... [/Редактирование]

switch (x)
{
   case 1:
      DoSomething();
      break;
   case 2:
      DoSomething();
      break;
   case 3:
      DoSomething();
      break;
   ...
}

private void DoSomething()
{
   ...
}

Высокий звук

switch (x)
{
   case 1:
   case 2:
   case 3:
      DoSomething();
      break;
   ...
}

private void DoSomething()
{
   ...
}
7
ответ дан Dr8k 30 November 2017 в 09:37
поделиться

. СЕТЕВАЯ Платформа 3.5 имеет диапазоны:

Счетный. Диапазон от MSDN

, с которым можно использовать его, "содержит" и оператор IF, так как как кто-то сказал, что Оператор переключения использует "==" оператор.

Здесь пример:

int c = 2;
if(Enumerable.Range(0,10).Contains(c))
    DoThing();
else if(Enumerable.Range(11,20).Contains(c))
    DoAnotherThing();

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

public static void MySwitchWithEnumerable(int switchcase, int startNumber, int endNumber, Action action)
{
    if(Enumerable.Range(startNumber, endNumber).Contains(switchcase))
        action();
}

старый пример с этим новым методом:

MySwitchWithEnumerable(c, 0, 10, DoThing);
MySwitchWithEnumerable(c, 10, 20, DoAnotherThing);

, Так как Вы передаете действия, не значения, необходимо опустить круглую скобку, это очень важно. Если Вы нуждаетесь в функции с аргументами, просто изменяете тип Action к Action<ParameterType>. При необходимости в возвращаемых значениях используйте Func<ParameterType, ReturnType>.

В C# 3.0 нет никакого легкого Частичное Приложение для инкапсуляции факта, параметр случая является тем же, но Вы создаете немного вспомогательного метода (немного подробный, tho).

public static void MySwitchWithEnumerable(int startNumber, int endNumber, Action action){ 
    MySwitchWithEnumerable(3, startNumber, endNumber, action); 
}

Здесь пример того, как новый функциональный импортированный оператор, по моему скромному мнению, более мощен и изящен, чем старый обязательный.

18
ответ дан Adam Bellaire 30 November 2017 в 09:37
поделиться

Этот синтаксис от Выбора Visual Basic ... Оператор выбора :

Dim number As Integer = 8
Select Case number
    Case 1 To 5
        Debug.WriteLine("Between 1 and 5, inclusive")
        ' The following is the only Case clause that evaluates to True.
    Case 6, 7, 8
        Debug.WriteLine("Between 6 and 8, inclusive")
    Case Is < 1
        Debug.WriteLine("Equal to 9 or 10")
    Case Else
        Debug.WriteLine("Not between 1 and 10, inclusive")
End Select

Вы не можете использовать этот синтаксис в C#. Вместо этого необходимо использовать синтаксис от первого примера.

70
ответ дан Slai 30 November 2017 в 09:37
поделиться

Можно не учесть новую строку, которая дает Вам:

case 1: case 2: case 3:
   break;

, но я рассматриваю тот плохой стиль.

31
ответ дан Community 30 November 2017 в 09:37
поделиться

В C# 7 мы теперь имеем Сопоставление с образцом , таким образом, можно сделать что-то как:

switch (age)
{
  case 50:
    ageBlock = "the big five-oh";
    break;
  case var testAge when (new List<int>()
      { 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 }).Contains(testAge):
    ageBlock = "octogenarian";
    break;
  case var testAge when ((testAge >= 90) & (testAge <= 99)):
    ageBlock = "nonagenarian";
    break;
  case var testAge when (testAge >= 100):
    ageBlock = "centenarian";
    break;
  default:
    ageBlock = "just old";
    break;
}
0
ответ дан 22 November 2019 в 22:18
поделиться

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

switch (value)
{
case 1: case 2: case 3:          
    // Do Something
    break;
case 4: case 5: case 6: 
    // Do Something
    break;
default:
    // Do Something
    break;
}
673
ответ дан 22 November 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: