【问题标题】:How to use Switch with dictionary values?如何将 Switch 与字典值一起使用?
【发布时间】:2012-05-20 08:25:08
【问题描述】:

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

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

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

如何让它发挥作用?

更新:这种动物的数量和它们的值对只有在运行时才知道,所以代码不能使用常量(我猜)。

【问题讨论】:

  • 你在 switch 块中做什么?基本上你不会能够打开非常量值,所以你需要考虑一些替代方案。有多种选择,但我们需要更多信息。
  • 您是否想过使用enum 来代替?还是值在运行时发生变化?
  • 我将 Texture2D 分配给一个新的精灵,它们在每种情况下都是独一无二的。
  • 你在箱子里做什么?
  • 听起来可以将其包装在一个方法中,并且可以传入从字典返回的内容。您可以发布示例吗?

标签: c# dictionary switch-statement


【解决方案1】:

您可以将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();

【讨论】:

  • “动作词典”听起来很酷。听起来像是我在儿童卡通片中听到的。不要害怕行动词典就在这里!
  • @Servy:听起来像是你用来吓唬孩子的东西;)
  • 太棒了!虽然我花了一些时间来了解它的工作原理并填补可能的漏洞。
  • 你们不觉得使用“动作字典”有点不好吗?你不应该尝试更多地解耦代码吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    enum AnimalsEnum { Dog, Cat, Bird, Fish };
    
    
    public whathuh(AnimalsEnum whichAnimal) {
     switch(whichAnimal) {
       case AnimalsEnum.Dog:
       case AnimalsEnum.Cat:
    ...
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      相关资源
      最近更新 更多