2012-05-11 8 views
7

Nel mio codice, mi piacerebbe lavorare con i nomi testuali degli elementi che sono codificati come un simbolo nei pacchetti.Come utilizzare Passa con i valori del dizionario?

In una situazione normale, 1012 significherebbe cat, dog, cat, frog per me, ma ci sono molte altre coppie come questa, quindi è difficile ricordarle tutte. A volte devono essere cambiati, quindi ho pensato di usare uno Dictionary<string, int> per questo scopo. Ma poi ...

switch (symbol) 
{ 
    case "0": { /* ... */ } 
    case "1": { /* ... */ } 
    case "2": { /* ... */ } 
    case "n": { /* ... */ } 
} 

... diventa ...

switch (symbol) 
{ 
    case kvpDic["cat"]: { /* ... */ } 
    case kvpDic["dog"]: { /* ... */ } 
    case kvpDic["frog"]: { /* ... */ } 
    case kvpDic["something else"]: { /* ... */ } 
} 

e lo studio dice che ho bisogno di usare le costanti per il mio interruttore.

Come faccio a farlo funzionare?

Upd: numero di tali animali ei loro coppie di valori sono noti solo in fase di esecuzione, in modo che il codice non deve utilizzare costanti (immagino).

+0

Che cosa stai facendo nei blocchi di commutazione? Fondamentalmente * non * sarà in grado di attivare valori non costanti, quindi dovrai pensare a * qualche * alternativa. Ci sono varie opzioni, ma avremo bisogno di più informazioni. –

+3

Hai mai pensato di usare un 'enum 'invece? O i valori cambiano in fase di esecuzione? –

+0

Assegno Texture2D ad un nuovo sprite e sono unici per ogni situazione. – user1306322

risposta

15

È possibile memorizzare un Func<T> o Action nel dizionario.

var dict = new Dictionary<int, Action>(); 
dict.Add(1,() => doCatThing()); 
dict.Add(0,() => doDogThing()); 
dict.Add(2,() => doFrogThing()); 

Poi, lo usano in questo modo:

var action = dict[1]; 
action(); 
+4

+1 per il dizionario di azioni. Effettivamente un'ottima combinazione;) – Sascha

+1

"Dizionario di azioni" sembra davvero fantastico. Sembra qualcosa che sentirò in un cartone animato per bambini. Non temere che il Dizionario di azione sia qui! – Servy

+0

@Servy: sembra qualcosa che potresti usare per spaventare i bambini;) –

1

non è una restrizione VS, si tratta di una restrizione di lingua. Quindi non sarai in grado di fare esattamente quello che vuoi. Un'idea sarebbe usare un enum. Un enum non può usare un valore char per le sue voci, guarda Why we can't have "char" enum types per alcune informazioni su questo.

0

Si desidera utilizzare un enum, non un dizionario.

enum AnimalsEnum { Dog, Cat, Bird, Fish }; 


public whathuh(AnimalsEnum whichAnimal) { 
switch(whichAnimal) { 
    case AnimalsEnum.Dog: 
    case AnimalsEnum.Cat: 
... 
} 

} 
Problemi correlati