【问题标题】:Retrieving dictionary<string, Action>检索字典<string, Action>
【发布时间】:2016-09-22 02:52:31
【问题描述】:

我正在为基于文本的游戏构建解析器,尝试一下更像是它。所以我想将所有可能的动词和名词存储到他们自己的字典中。但是在尝试从字典中检索字符串键时出现错误...

在我的 Dictionary 类中,我创建了 Verbs 字典,如下所示:

public Dictionary<string, Action> Verbs = new Dictionary<string, Action>();

然后我继续为其添加一些价值:

public void PopulateVerbs()
    {
        Verbs.Add("MOVE", Action.MoveAction);          
    }

在我的 VerbAction 类中,我有一些基于输入的方法:

Action Move = dictionary.Verbs["MOVE"];

    public void MoveAction()
    {
        Console.WriteLine("You moved...");
    }

最后,在我的 CommandHandler 类中,我处理输入:

if (InputToken[0] == dictionary.Verbs["MOVE"])
            Action.MoveAction();

这就是我得到错误的地方,它说我试图检索的 ["MOVE"] 字符串实际上是一个动作,所以我有点困惑。我在这里错过了什么?

【问题讨论】:

  • 所以基本上你所拥有的(结果)是Action类型。意思是Verbs["string"]= Action the_action_you_defined。当您定义 Dictionory&lt;TKey,TValue&gt; someDictionary=new Dictionary&lt;TKey,TValue&gt; someDictionary[TKey] 类型时返回 TValue
  • 是的,现在说得通了,感谢您的澄清!
  • 不清楚这段代码中的Action是自定义的enum还是内置的delegate。第二个代码 sn-p 表示前者。最终代码sn-p表示后者。

标签: c# dictionary action


【解决方案1】:

Verbs["MOVE"] 将获取 valuekey "MOVE" 一起存储,因此在这种情况下它将返回一个 Action。我假设 InputToken 是一个字符串列表,并且假设您有一个充满字符串/操作值的字典,代表您的操作,我可能会尝试这样的事情,这样您就不需要一堆 if 检查:

if (InputToken[0] == dictionary.Verbs["MOVE"])
        Action.MoveAction();

并利用字典来发挥你的优势:

Action theAction = dictionary.Verbs[InputToken[0]];
theAction();

你也可以进一步压缩:

dictionary.Verbs[InputToken[0]]();

此外,字典是一个非常健壮的类,因此您可以使用它的功能开始添加错误处理检查(如 Verbs.ContainsKey 等)

【讨论】:

  • 你说强吗?!非常感谢!
  • 是的,您必须记住,您可能需要一个不存在的键的值。字典允许您事先检查
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 2012-10-01
相关资源
最近更新 更多