如何使用Switch与字典值?

时间:2012-05-11 18:07:48

标签: c# dictionary switch-statement

在我的代码中,我想处理在数据包中编码为一个符号的项目的文本名称。

在通常的情况下,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"]: { /* ... */ }
}

并且工作室说我需要为我的开关使用常量。

如何让它发挥作用?

更新:此类 animals 的数量及其值对仅在运行时已知,因此代码不得使用常量(我猜)。

3 个答案:

答案 0 :(得分:17)

您可以在字典中存储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();

答案 1 :(得分:1)

这不是VS限制,而是语言限制。所以你将无法完全按照自己的意愿行事。一个想法是使用枚举。枚举不能对其条目使用char值,请查看Why we can't have "char" enum types以获取相关信息。

答案 2 :(得分:0)

您想要使用枚举,而不是字典。

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


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

}