2012-05-11 18 views
7

En mi código, me gustaría trabajar con nombres textuales de los elementos codificados como un símbolo en paquetes.Cómo usar ¿Cambiar con valores de diccionario?

En una situación habitual, 1012 significa cat, dog, cat, frog, pero hay muchos más pares como este, por lo que es difícil recordarlos todos. A veces necesitan ser cambiados, así que pensé que debería usar un Dictionary<string, int> para ese propósito. Pero entonces ...

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

... ... se convierte en

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

y el estudio dice que tengo que usar constantes para mi interruptor.

¿Cómo puedo hacer que funcione?

UPD: número de tales animales y sus pares de valores son sólo conocidos en tiempo de ejecución, por lo que el código no debe utilizar constantes (supongo).

+0

¿Qué haces en los bloques de interruptores? Básicamente, * no podrá * activar valores no constantes, por lo que deberá pensar en * alguna * alternativa. Hay varias opciones, pero necesitaremos más información. –

+3

¿Has pensado utilizar un 'enum' en su lugar? ¿O cambian los valores en tiempo de ejecución? –

+0

Asigné Texture2D a un nuevo sprite y son únicos para cada situación. – user1306322

Respuesta

15

En su lugar, podría almacenar Func<T> o Action en el diccionario.

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

Entonces, lo utilizan de esta manera:

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

+1 para el diccionario de Acción. De hecho, una gran combinación;) – Sascha

+1

"Action Dictionary" suena genial. Suena como algo que oiría en una caricatura de niños. ¡No temas que el Diccionario de Acción esté aquí! – Servy

+0

@Servy: suena como algo que utilizarías para asustar a los niños;) –

1

no es una restricción VS, es una restricción de idioma. Entonces no podrás hacer exactamente lo que quieras. Una idea sería usar una enumeración. Una enumeración no puede usar un valor de char para sus entradas, mira Why we can't have "char" enum types para obtener información sobre eso.

0

Desea utilizar una enumeración, no un diccionario.

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


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

} 
Cuestiones relacionadas