2012-05-11 8 views
7

In meinem Code möchte ich mit Textnamen der Elemente arbeiten, die als ein Symbol in Paketen codiert sind.Wie benutzt man den Schalter mit Wörterbuchwerten?

In einer üblichen Situation würde 1012 für mich cat, dog, cat, frog bedeuten, aber es gibt viele weitere Paare wie diese, so dass es schwer ist, sich an alle zu erinnern. Manchmal müssen sie geändert werden, also dachte ich, ich sollte einen Dictionary<string, int> für diesen Zweck verwenden. Aber dann ...

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

... wird ...

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

und das Studio sagt, ich brauche Konstanten für meinen Schalter zu verwenden.

Wie kann ich es funktionieren lassen?

Upd: Anzahl solcher Tiere und deren Wertepaare sind nur zur Laufzeit bekannt ist, so muss der Code nicht Konstanten verwenden (glaube ich).

+0

Was machst du in den Schaltblöcken? Grundsätzlich * können * Sie nicht-konstante Werte nicht einschalten, also müssen Sie an * einige * Alternativen denken. Es gibt verschiedene Möglichkeiten, aber wir brauchen mehr Informationen. –

+3

Haben Sie daran gedacht, stattdessen eine 'enum' zu verwenden? Oder ändern sich die Werte zur Laufzeit? –

+0

Ich ordne Texture2D einem neuen Sprite zu und sie sind einzigartig für jede Situation. – user1306322

Antwort

15

Sie könnten stattdessen ein Func<T> oder Action im Wörterbuch speichern.

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

Dann verwenden Sie es wie so:

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

+1 für das Aktionswörterbuch. In der Tat eine tolle Kombination;) – Sascha

+1

"Action Dictionary" klingt einfach cool. Klingt nach etwas, was ich in einem Kinder-Cartoon hören würde. Fürchte dich nicht, dass das Action-Wörterbuch hier ist! – Servy

+0

@Servy: Klingt wie etwas, das Sie verwenden würden, um den Mist von Kindern zu erschrecken;) –

1

Es ist kein VS Einschränkung, es ist eine Sprache Einschränkung. Sie werden also nicht in der Lage sein, genau das zu tun, was Sie wollen. Eine Idee wäre, ein Enum zu verwenden. Ein enum kann keinen char-Wert für seine Einträge verwenden, siehe Why we can't have "char" enum types für einige Informationen dazu.

0

Sie möchten ein Enum verwenden, kein Wörterbuch.

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


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

}