2010-03-31 13 views
15

Czy ktoś wie, czy możliwe jest dołączenie zakresu w instrukcji switch (a jeśli tak, to jak)?Switch Statement in C#

Na przykład:

switch (x) 
{ 
    case 1: 
    //do something 
    break; 
    case 2..8: 
    //do something else 
    break; 
    default: 
    break; 
} 

Kompilator nie lubią tego rodzaju składni - ani nie podoba:

case <= 8: 

Odpowiedz

23

Nie, nie jest to możliwe. Istnieje kilka sposobów, robiłem to w przeszłości:

Fixed Kodowanie:

switch (x) 
{ 
    case 1: 
    //do something 
    break; 
    case 2: 
    case 3: 
    case 4: 
    case 5: 
    case 6: 
    case 7: 
    case 8: 
    //do something else 
    break; 
    default: 
    break; 
} 

W połączeniu z if {} stwierdzeniem:

switch (x) 
{ 
    case 1: 
    //do something 
    break; 
    default: 
    if (x <= 8) 
    { 
     // do something 
    } 
    else 
    { 
     // throw exception 
    } 
    break; 
} 
+2

+1 dla drugiego przykładu.Pierwszy sprawia, że ​​chcę kogoś skrzywdzić. :) –

+0

Pierwszy przykład wydaje się dziwny: wiem, że to prawda, np. Java, ale [wpis MSDN] (https://msdn.microsoft.com/en-us/library/06tc147t.aspx) dla 'przełącznika 'wyraźnie stwierdza, że ​​kompilator nie pozwoli na" fall-throughs ". Czy może czegoś tutaj brakuje? – Informagic

+0

Okay, najwyraźniej jest to dozwolone dla "pustych" przypadków. – Informagic

3

Krótka odpowiedź: nr. Możliwe byłoby zapisanie wszystkich tych przypadków, ale taka notacja zakresu nie jest obsługiwana.

Myślę, że trzeba użyć tutaj oświadczenia if lub zmienić na język, w którym jest lepsze wsparcie dla przypadków dyskryminacji.

2

Jeśli masz tak mało przypadków, bardzo preferowane jest ustawienie if.

1

Można obsługiwać jawne przypadki po przypadku, a jeśli masz tylko jeden zakres, zajmij się nim w domyślnym przypadku.

-1

można zrobić

case 2: 
case 3: 
case 4: 
... 
case 8: 
// code here 
break 
+0

[-] Ta odpowiedź została już dostarczona przez Andy'ego Shellama powyżej. –

5

Nie, ale można napisać to, więc przynajmniej uniknąć pisania // do something else część wielokrotnie.

switch (x) 
{ 
    case 1: 
    //do something 
    break; 
    case 2: case 3: case 4: case 5: case 6: case 7: case 8: 
    //do something else 
    break; 
    default: 
    break; 
} 
+0

wspomniano powyżej, ale ważny jest punkt dotyczący formatowania :) Dbam o komunikację –

-1

Można wykorzystać przypadek upadku przez:

switch (x) 
{ 
    case 1: 
    //do something 
    break; 
    case 2: 
    case 3: 
    case 4: 
    case 5: 
    case 6: 
    case 7: 
    case 8: 
    //do something else 
    break; 
    default: 
    break; 
} 

Ale po prostu skorzystam, jeśli do tego.

+0

[-] Ta odpowiedź została już dostarczona przez Andy'ego Shellama powyżej. –

-1

Nie można używać żadnych instrukcji warunkowych w przypadku przełącznika.

Jeśli chcesz wykonać te same linie kodu dla różnych opcji, a następnie można zrobić jedno:

switch (i) 
      { 
       case 0: 
       case 1: 
       case 2: 
       case 3: 
        //do something here. 
        break; 
       default: 
        //do something here. 
        break; 
      } 
+0

[-] Odpowiedź powyżej już dostarczona przez Andy'ego Shellama. –

2

Jedną z możliwości jest przekształcenie zakresów do liczb całkowitych. Na przykład:

//assuming x>=9 or if (x <= 0) return; 
     switch((x+12)/7) 
     { case 1:Console.WriteLine("one"); 
       break; 
      case 2:Console.WriteLine("2 through 8 inclusive"); 
       break; 
      case 3:Console.WriteLine("9 through 15 inclusive"); 
       break; 
      default: Console.WriteLine("16 or more"); 
       break; 
     } 
0

Choć nie było to możliwe, kiedy pierwotnie zadał to pytanie, poprzez cud C Matching # wzorca, to teraz jest (w języku C# 7):

switch (i) 
{ 
    case var test when test <= 2: 
     Console.WriteLine("Less than 2"); 
     break; 

    case var test when test > 2 && test < 10: 
     Console.WriteLine("Between 2 and 10"); 
     break; 

    case var test when test >= 10: 
     Console.WriteLine("10 or more"); 
     break; 
} 

A blog post on the subject