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

public void setYear(String year) {
       if (Integer.parseInt(year) >= 0) {
           //Do stuff here
       }
}

Используйте Integer.parseInt (String s) , чтобы проверить, можно ли преобразовать год строки в целое число, большее или равное нулю (логически, год не может быть отрицательным). Если вход не может быть преобразован в целое число, он выдаст исключение NumberFormatException .

534
задан 30.11.2017, 21:37

7 ответов

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

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

291
ответ дан 28.07.2019, 20:46
  • 1
    Как дополнение я хотел добавить ссылку к спецификации языка C#, доступной на MSDN в msdn.microsoft.com/en-us/vcsharp/aa336809.aspx – Richard McGuire 16.09.2008, 16:20
  • 2
    Пользователь мог использовать некоторый if' s (или поиск по таблице), чтобы уменьшить вход до ряда перечислений и включить перечисление. – Harvey 29.07.2013, 10:00

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


string s = foo();

switch (s) {
  case "abc": /*...*/ break;
  case "def": /*...*/ break;
}
5
ответ дан 28.07.2019, 20:46
  • 1
    это могло стать большим глюком позже для кого-то еще пытающегося считать код – Andrew Harry 12.07.2011, 17:45

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

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

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

5
ответ дан 28.07.2019, 20:46

Другая опция состояла бы в том, чтобы использовать стандартную программу. Если случаи 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
ответ дан 28.07.2019, 20:46

. СЕТЕВАЯ Платформа 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
ответ дан 28.07.2019, 20:46
  • 1
    Хороший выбор. Одна вещь отметить, хотя - Счетный. Диапазон имеет аргументы int start и int count. Ваша привычка в качестве примера работает правильно способ, которым они были записаны. Вы пишете его, как будто второй аргумент int end. Например - Enumerable.Range(11,20) привел бы к 20 числам, запускающимся с 11, и не числам от 11 до 20. – Gabriel McAdams 03.08.2012, 12:46
  • 2
    хотя, при работе с Перечислением, почему не что-то как? если (Счетный. Диапазон (MyEnum. A, MyEnum. M) {DoThing ();} еще, если (Счетный. Диапазон (MyEnum. N, MyEnum. Z) {DoAnotherThing ();} – David Hollowell - MSFT 07.03.2014, 03:22
  • 3
    Недавно я работал над новыми аппаратными средствами/программным продуктом в своей компании, мне повезло убедить парня, ответственного изменять некоторые предупреждения компилятора на ошибки. Изменение предупреждений ошибке вынудило всех избавиться от этих предупреждений. – Trevor Boyd Smith 08.10.2019, 04:24

Этот синтаксис от Выбора 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
ответ дан 28.07.2019, 20:46
  • 1
    это - одна из нескольких вещей, которые я пропускаю о *Основной. – nickf 16.10.2008, 15:57
  • 2
    Здесь у нас есть один из нескольких дисплеев, где Visual Basic не так ужасен, и более универсален, чем c#. Это - ценный пример! – bgmCoder 14.04.2013, 15:09
  • 3
    /W4 - > только из любопытства, Вы могли уточнить о/W4? – Trevor Boyd Smith 08.10.2019, 04:23

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

case 1: case 2: case 3:
   break;

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

31
ответ дан 28.07.2019, 20:46
  • 1
    Это изменение флагов компилятора было лучшим, я добрался до изменения нашего " кодирование style" и " processes" на самом деле не имея необходимость отправить почтовый мандат всем. – Trevor Boyd Smith 08.10.2019, 04:24

Теги

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