2016-06-23 7 views
-5

ОБНОВЛЕНО:C# Переключение утверждение сценария

Есть ли способ сделать то, что приведенный ниже код пытается сделать (не проходит синтаксис, так как случай 2 и корпус 3 не может содержать повторяющиеся объявления и/или потому, что Num может 't быть 2 и 3 в то же время)?

 var num = 0; 
     switch (num) 
     { 
      case 1: 
       //do stuff applicable to 1 only; 
       break; 
      case 2: 
       //do stuff applicable to 2 only; 
       break; 
      case 3: 
       //do stuff applicable to 3 only; 
       break; 
      case 2: 
      case 3: 
       //do stuff applicable to 2 and 3 only; 
       break; 
     } 
+3

Логика не имеет смысла. Как бы вы прошли через 2 и 3 в одном int? – Igor

+0

'switch' не может делать то, что вам нужно. используйте 'if'. – AgentFire

+0

@AgentFire - даже с 'if' он все равно не может быть выполнен. Единый int не может представлять 2 значения (2 и 3). – Igor

ответ

2

не с одноуровневой switch (или неприятный GOTO). Коммутатор может выполнять только один случай. Лучшее решение было бы вложенным if (или switch) в пределах 2/3 случая:

switch (num) 
{ 
    case 1: 
     //do stuff applicable to 1 only 
     break; 
    case 2: 
    case 3: 
     if(num == 2) 
     { 
      //do stuff applicable to 2 only 
     } 
     if(num == 3) 
     { 
      //do stuff applicable to 3 only 
     } 
     //do stuff applicable to 2 OR 3 
     break; 
} 
+0

Конечно, этот точный код тот же если вы удалите два оператора if, поскольку промежуточные присвоения 'text', похоже, не имеют значения. Это артефакт из вопроса, который сделал его неясным в первую очередь. – juharr

+0

@juharr True - я преобразовал их в комментарии, чтобы избавиться от этой двусмысленности. –

+0

Вам не нужны две конструкции if. Это может быть просто конструкция if-else здесь, учитывая, что num может быть только 2 или 3. – ManoDestra

6

Этот вопрос поставлен смешения. Я думаю, что вы хотите иметь случай, который работает для двоих, случай, который работает для трех, и случай, который работает для двух или трех.

Просто используйте два переключателя:

switch (num) 
    { 
     case 1: One(); break; 
     case 2: Two(); break; 
     case 3: Three(); break; 
    } 
    switch (num) 
    { 
     case 2: 
     case 3: TwoOrThree(); break; 
    } 

Или

switch (num) 
    { 
     case 1: One(); break; 
     case 2: 
     case 3: 
      switch (num) 
      { 
      case 2: Two(); break; 
      case 3: Three(); break; 
      } 
      TwoOrThree(); 
      break; 
    } 

или дублировать код:

switch (num) 
    { 
     case 1: One(); break; 
     case 2: Two(); TwoOrThree(); break; 
     case 3: Three(); TwoOrThree(); break; 
    } 

Я бы не рекомендовал ООН-множительной код вроде этого:

switch (num) 
    { 
     case 1: One(); break; 
     case 2: Two(); goto twoOrThree; break; 
     case 3: Three(); twoOrThree: TwoOrThree(); break; 
    } 

Yuck.

0

Вы могли бы просто использовать if заявления вместо

var num = 0; 
if(num == 1) 
{ 
    // do stuff applicable to 1 only 
} 
else if(num == 2) 
{ 
    // do stuff applicable to 2 only 
} 
else if(num == 3) 
{ 
    // do stuff applicable to 3 only 
} 
if(num == 2 || num == 3) 
{ 
    // do stuff applicable to 2 AND 3 
} 

Или как switch и if

switch (num) 
{ 
    case 1: 
     // do stuff applicable to 1 only 
     break; 
    case 2: 
     // do stuff applicable to 2 only 
     break; 
    case 3: 
     // do stuff applicable to 3 only 
     break; 
} 
if(num == 2 || num == 3) 
{ 
    // do stuff applicable to 2 AND 3 
} 
-1

Вы можете использовать goto case заявление и имеют уникальный идентификатор для комбинированных операций в случае, если 2 и 3. Удостоверьтесь, что это никогда не попадает ни в какой другой номер:

var num = 0; 
var text = ""; 
switch (num) 
{ 
    case 1: 
     text = "do stuff applicable to 1 only"; 
     break; 
    case 2: 
     text = "do stuff applicable to 2 only"; 
     goto case 23; 
    case 3: 
     text = "do stuff applicable to 3 only"; 
     goto case 23; 
    case 23: 
     text = "do stuff applicable to 2 AND 3"; 
     break; 
} 

Использование goto не рекомендуется вообще, но обычно использовать его в операторах switch и подобных ситуациях.

+0

Но что, если 'num' равно 23? – juharr

+0

@juharr Вот почему я написал уникальный номер. -23 или 23000, все, что обычно не появляется. – Arglist

1

Это так просто, как это ...

switch (value) 
{ 
    case 1: 
     // Do 1 stuff 
     break; 
    case 2: 
    case 3: 
     // We can use an if-else construct here given that there's only two possibilities. 
     if (value == 2) 
     { 
      // 2 only stuff here 
     } 
     else 
     { 
      // 3 only stuff here 
     } 

     // Do anything applicable to BOTH here, or above the if construct, depending on your requirements. 

     break; 
    default: 
     // Any other stuff here 
     break; 
} 

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

if (value == 1) 
{ 
    // 1 stuff 
} 
else if (value == 2 || value == 3) 
{ 
    if (value == 2) { 
     // 2 stuff only 
    } 
    else 
    { 
     // 3 stuff only 
    } 

    // 2 or 3 stuff, or above the if construct above, if you require. 
} 
else 
{ 
    // Anything else here 
} 

Или просто ...

switch (value) 
{ 
    case 1: 
     OneStuff(); 
     break; 
    case 2: 
     TwoStuff(); 
     TwoOrThreeStuff(); 
     break; 
    case 3: 
     ThreeStuff(); 
     TwoOrThreeStuff(); 
     break; 
    default: 
     AnythingElse(); 
} 

И завернуть, что вам нужно сделать для каждого из указанных выше в отдельных встретились HODS.

Третий способ - это мое предпочтение здесь. Это чище и проще отлаживать, чем использовать сложные смеси переключателя, и если.

+0

Мне не нравится третий метод, потому что вы дважды вызываете метод TwoOrThreeStuff(), чего я пытаюсь избежать в первую очередь. Мне нравится ваш первый ответ, который совпадает с ответом, который я обозначил как принятый ответ, и не дублирует код. –

+0

В третьем примере нет дублирующего кода. TwoOrThreeStuff() будет единственным методом, который вызывается только из двух мест. На самом деле это правильный способ сделать такую ​​логику. Безусловно, самый сложный и наиболее удобный способ сделать это. – ManoDestra

+0

моя ошибка, я должен был бы назвать один и тот же код дважды по сравнению с дублирующим кодом. Разве не лучше назвать его один раз, а в два раза больше равным? Ваш первый способ выглядит так же, как поддерживаемый/читаемый/etc? возможно, расщепляя волосы в этот момент? просто пытаясь узнать/получить другие перспективы, THX! –