2012-05-11 5 views
7

В моем коде я хотел бы работать с текстовыми именами элементов, которые закодированы как один символ в пакетах.Как использовать Switch со значениями словаря?

В обычной ситуации 1012 будет означать для меня cat, dog, cat, frog, но таких пар еще много, поэтому их сложно запомнить. Иногда их нужно менять, поэтому я решил использовать для этой цели Dictionary<string, int>. Но потом ...

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

... становится ...

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

и студия говорит, что нужно использовать константы для моего коммутатора.

Как это сделать?

Обно: число таких животных и их пар значений известно только во время выполнения, так что код не должен использовать константы (я думаю).

+0

Что вы делаете в блоках переключателей? В основном вы * не будете * иметь возможность включать непостоянные значения, поэтому вам нужно подумать о * некоторой * альтернативе. Существуют различные варианты, но нам нужна дополнительная информация. –

+3

А вы думали об использовании 'enum' вместо этого? Или значения изменяются во время выполнения? –

+0

Я назначаю Texture2D новому спрайту, и они уникальны для каждой ситуации. – user1306322

ответ

15

Вместо этого вы можете сохранить Func<T> или Action.

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

Затем, используйте его так:

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

+1 для словаря действия. Действительно отличная комбинация;) – Sascha

+1

«Словарь действия» просто звучит круто. Похоже на то, что я слышал в мультфильме для детей. Не бойтесь Словаря действия! – Servy

+0

@Servy: Похоже на то, что вы использовали бы, чтобы напугать дерьмо детей;) –

1

Это не ограничение VS, это ограничение языка. Таким образом, вы не сможете делать именно то, что хотите. Одна идея заключалась бы в использовании перечисления. Перечисление не может использовать значение char для своих записей, посмотрите на Why we can't have "char" enum types для получения некоторой информации об этом.

0

Вы хотите использовать перечисление, а не словарь.

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


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

} 
Смежные вопросы