in C#

2010-03-31 8 views
15

Qualcuno sa se è possibile includere un intervallo in un'istruzione switch (e se sì, come)?in C#

Ad esempio:

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

Il compilatore non sembra gradire questo tipo di sintassi - essa non piace:

case <= 8: 

risposta

23

No, questo non è possibile. Ci sono alcuni modi che ho fatto in passato:

fisso codifica:

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; 
} 

In combinazione con un if {} dichiarazione:

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

+1 per il secondo esempio.Il primo mi fa venir voglia di ferire qualcuno. :) –

+0

Il primo esempio sembra strano: so che è vero per, ad esempio, Java, ma la [voce MSDN] (https://msdn.microsoft.com/en-us/library/06tc147t.aspx) per 'switch 'afferma esplicitamente che il compilatore non permetterà" fall-through ". O mi sto perdendo qualcosa qui? – Informagic

+0

Ok, apparentemente questo è permesso per "vuoto" 'caso's. – Informagic

3

Risposta breve: no . Sarebbe possibile scrivere tutti i casi lì ma tale notazione non è supportata.

Penso che sia necessario utilizzare la dichiarazione if qui o passare a una lingua in cui esiste un supporto migliore per la descrizione del caso.

2

Se si dispone di così pochi casi, if sarebbe molto preferito.

1

È possibile gestire i casi espliciti caso per caso e, se si dispone di un intervallo, trattarlo nel caso predefinito.

-1

si può fare

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

[-] Questa risposta è già stata fornita da Andy Shellam sopra. –

5

No, ma è possibile scrivere questo, in modo da almeno evitare di scrivere le più volte // do something else parte.

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

già menzionato sopra, ma punto importante sulla formattazione :) Mi interessa la comunicazione –

-1

È possibile utilizzare caso caduta attraverso:

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; 
} 

Ma lo userei solo se per questo.

+0

[-] Questa risposta è già stata fornita da Andy Shellam sopra. –

-1

Non è possibile utilizzare alcuna istruzione condizionale in un caso di scambio.

Se si desidera eseguire le stesse linee di codice per le diverse opzioni allora si può fare una cosa:

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

[-] Risposta sopra fornita da Andy Shellam. –

2

Una possibilità è quella di convertire gli intervalli in numeri interi. Per esempio:

//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

Anche se questo non era possibile, quando ho inizialmente fatto questa domanda, attraverso il miracolo della C# Pattern Matching, ora è (in 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