2011-11-16 4 views
13

Sono pazzo o c'è un modo, in C#, per impostare una variabile sul risultato di un interruttore? Qualcosa di simile:Impostazione di una variabile al risultato di un commando

var a = switch(b) 
    { 
    case c: 
    d; 
    case e: 
    f; 
    default: 
    g; 
    }; 

È possibile in qualsiasi altra lingua? Ho solo pensato che fosse, ma non ho nulla da compilare. Grazie in anticipo.

+3

'switch (b) {case c: a = d; caso e: a = f; default: a = g;} ' –

+0

F # ha questo – BLUEPIXY

risposta

20

No, switch è una dichiarazione piuttosto che un'espressione che può essere valutata.

Naturalmente, è possibile estrarre in un altro metodo:

int x = DoSwitch(y); 

... 

private int DoSwitch(int y) 
{ 
    switch (y) 
    { 
     case 0: return 10; 
     case 1: return 20; 
     default: return 5; 
    } 
} 

In alternativa, è possibile utilizzare un Dictionary se è solo un caso di semplici, mappature costanti. Se puoi darci maggiori informazioni su ciò che stai cercando di ottenere, probabilmente possiamo aiutarti a trovare il modo più idiomatico di arrivarci.

+0

No, posso sicuramente capirlo in un milione di modi, ho appena avuto l'a = qualunque in ogni affermazione e ho pensato di averlo visto accadere. Non indovinare. Oh bene. Nessun grosso problema. – vbullinger

+0

Un 'dizionario' era esattamente ciò di cui avevo bisogno, grazie! –

12

No, non è possibile utilizzare un'istruzione switch come espressione. Un altro modo di scrivere è annidato operatori condizionali:

var a = b == c ? d: 
     b == e ? f: 
       g; 
1

No.

Una dichiarazione switch fornisce ramificazione di controllo. Non è una funzione che valuta qualcosa che potrebbe essere assegnato a una variabile.

6

Questo non è possibile in C#.

Il più vicino sarebbe quello di spostare sia questo in un metodo, o fare l'assegnazione di ogni singolo caso, vale a dire:

int a; 
switch(b) 
{ 
case c: 
    a = d; break; 
case e: 
    a = f; break; 
default: 
    a = g; break; 
}; 

E 'possibile in qualsiasi altra lingua?

Sì. Ad esempio, la maggior parte delle lingue funzionali supporta qualcosa di simile. Ad esempio, F # 's pattern matching fornisce una (molto più potente) versione di questo.

6

Se non fossi particolarmente preoccupato per l'efficienza, sarebbe piuttosto facile da cucinare un po 'di classe utilizzando farmaci generici che ha permesso di utilizzare una catena di "fluente" del metodo di chiamate di questo tipo:

var a=Switch(b).Case(c).Then(d).Case(e).Then(f).Default(g); 

o, se si preferisce, il più compatto

var a=Switch(b).Case(c, d).Case(e, f).Default(g); 

Se questo vi interessa, io sarei felice di cucinare un esempio

+1

Wow, questo è esattamente quello che ho fatto [qui] (http://stackoverflow.com/questions/3334138/combine-return-and-switch/3334876#3334876) –

+2

Oh, è dolce !!! –

+0

... anche se penso che la tua implementazione possa essere semplificata ... puoi farlo con strutture dati immutabili, e non c'è bisogno di mantenere un dizionario. Potrei commentare quell'altra discussione se non ti dispiace :-) –

3

switch in C# è una dichiarazione questo non ha un valore di "ritorno". Se siete interessati ad avere un'espressione "switch", è possibile trovare la piccola classe fluente che ho scritto here al fine di avere codice come questo:

a = Switch.On(b) 
    .Case(c).Then(d) 
    .Case(e).Then(f) 
    .Default(g); 

Si potrebbe andare un passo oltre e generalizzare questo ancora di più con parametri di funzione ai metodi Then.

1

Volevo la stessa cosa perché uso Ruby molto, e questo ti permette di fare quel genere di cose.Così ho creato un pacchetto nuget chiamato FluentSwitch.

+0

È fantastico, grazie! – vbullinger