2009-10-12 13 views
31

devo implementare la seguente in una dichiarazione switch:valutare le espressioni in istruzioni switch in C#

switch(num) 
{ 
    case 4: 
    // some code ; 
    break; 
    case 3: 
    // some code ; 
    break; 
    case 0: 
    // some code ; 
    break; 
    case < 0: 
    // some code ; 
    break; 
} 

E 'possibile avere l'istruzione switch valutare case < 0? Altrimenti, come potrei farlo?

+4

Si prega di non contrassegnare la tua domanda come "Urgente", anche se è per te: http://catb.org/~esr/faqs/smart-questions.html#urgent –

risposta

57

Non è possibile - lo scambio/caso è solo per valori individuali. Se si desidera specificare condizioni, è necessario un "se":

if (num < 0) 
{ 
    ... 
} 
else 
{ 
    switch(num) 
    { 
     case 0: // Code 
     case 1: // Code 
     case 2: // Code 
     ... 
    } 
} 
+0

Grazie mille –

+22

o anche switch (num) {case 0: case 1: default: if (num <0) {..}} – falstro

+2

@roe: Sì, ho pensato di dare anche quella forma. Ran out of time però :) –

5

Dovrete usare se, tempo che si desidera o meno. Switch è solo in grado di confrontare il tuo valore con valori costanti.

+1

Non vero - è possibile utilizzare un operatore ternario per consolidare il caso meno-zero in un singolo valore e valutarlo nel interruttore. –

+0

Questo è vero. È solo una restrizione della lingua. È possibile farlo in VB.Net, così come altre cose come l'utilizzo di intervalli di valori. Come C#, se deve confrontarsi con il valore letterale, ma ci sono più operazioni di confronto disponibili. –

+0

Davvero Charles? Interessante. Non lo sapevo. –

7

Se il num non può essere inferiore a zero:

public int GetSwitch(int num) { return num < 0 ? -1 : num; } 
switch(GetSwitch(num)) 
{ 
case 4: // some code ; break; 
case 3:// some code ; break; 
case 0: // some code ; break; 
case -1 :// some code ; break; 
} 

Se può, utilizzare un altro numero "inesistente", come int.MinValue.

+0

Questo è quello che stavo per suggerire - ma perché mettere il ternario in una funzione diversa? –

+0

soluzione interessante +1, anche se personalmente ritengo che la funzione extra chiami la vista un po ', 'switch (num <0? -1: num)' sembra più esplicativa. – falstro

+0

Sono un grande seguace di SRP e DRY - quindi, anche inconsciamente, separo un comportamento da un altro comportamento non correlato. GetSwitch(), ad esempio, può essere riutilizzato, e se hai bisogno di due opzioni - copia/incolla il tuo ternario lì dentro? Non considero copia/incolla una buona pratica. – queen3

5

L'unico modo che ho potuto pensare (e io davvero non consigliamo vivamente), sarebbe la seguente:

int someValue; 

switch (Math.Max(someValue, -1)) 
{ 
    case -1: 
     // will be executed for everything lower than zero. 
     break; 

    case 0: 
     // will be executed for value 0. 
     break; 

    case 1: 
     // will be executed for value 1. 
     break; 

    default: 
     // will be executed for anything else. 
     break; 
} 
+0

Perché sto ottenendo downvoted? –

+0

Perché non solo Math.Max ​​(someValue, -1)? Quindi non deve preoccuparsi dell'offset del +1 ... – JustLoren

+0

Non ti ha offuscato, ma penso che sia solo un cattivo stile. – chakrit

13

Si potrebbe fare qualcosa di simile a questo alla fine della vostra istruzione switch:

default: 
    if(num < 0) 
    { 
     ... // Code 
    } 
    break; 
3

Il contrario sarebbe possibile anche (in relazione alla risposta di Jon Skeet):

switch(num) 
{ 
    case a: 
     break; 
    default: 
     if(num < 0) 
     {} 
    break; 
} 
1

non è possibile noi e confronti in switch come in VB, hai 2 opzioni qui, sostituisci il valore con un valore noto e utilizzalo o, se intendi tutti gli altri casi, puoi usare la clausola predefinita:

switch(num) 
{ 
    case 4: 
    // some code ; 
    break; 
    case 3: 
    // some code ; 
    break; 
    case 0: 
    // some code ; 
    break; 
    default: 
    // some code ; 
    break; 
} 

Nota che questo non è esattamente quello che hai chiesto: qualsiasi valore diverso da 0,3,4 finirà nella clausola deafult :.

Problemi correlati