字典和功能

时间:2016-05-02 20:12:21

标签: c# dictionary

我最近开始使用C#,我曾经想在C#中轻松完成这项工作。

例如,我有一个像:

这样的函数
def my_func():
 return "Do some awesome stuff"

和一本字典:

my_dic = {"do": my_func}

我制作了一个脚本,当用户输入“do”时,程序会根据字典调用my_func

我想知道如何将函数分配给C#字典中的字符串。

4 个答案:

答案 0 :(得分:50)

基本上以同样的方式:

static void Main() {
    var dict = new Dictionary<string, Action>();
    // map "do" to MyFunc
    dict.Add("do", MyFunc);
    // run "do"
    dict["do"]();
}

static void MyFunc() {
    Console.WriteLine("Some stuff");
}

答案 1 :(得分:18)

您可以在此处利用集合初始化程序语法。

var my_dic = new Dictionary<string, Action>
{
    { "do", my_func }
};

对于更复杂的功能,您可以使用相应的Action类型替换声明中的Function

答案 2 :(得分:5)

与您的示例最直接类似的C#代码片段是:

string my_func() {
  return "Do some awesome stuff";
}

var my_dic = new Dictionary<string, Func<string>> {
  { "do", my_func },
};

正如其他海报所指出的那样,技巧是创建一个字符串,其泛型值类型是Action(返回void的方法)或Func&lt; T&gt;。 (这是一个返回T类型对象的方法。)

在任何一种情况下,您都可以使用以下方法执行该方法:

var result = my_dic["do"]();

答案 3 :(得分:2)

如果你真的想要Python的动态行为(即能够无缝地分配和调用具有不同签名的方法到&#34;字典&#34;),我会选择具体的ExpandoObject意味着能够让CLR支持动态语言,如Python(参见IronPython等)。

static void Main()
{
    dynamic expando = new ExpandoObject();
    expando.Do = new Func<string>(MyFunc);
    expando.Do2 = new Func<string, string>(MyFunc2);

    Console.WriteLine(expando.Do());
    Console.WriteLine(expando.Do2("args"));
}

static string MyFunc()
{
    return "Do some awesome stuff";
}

static string MyFunc2(string arg)
{
    return "Do some awesome stuff with " + arg;
}

如果您愿意,您甚至可以将ExpandoObject视为字典:

static void Main(string[] args)
{
    dynamic expando = new ExpandoObject();
    var dict = (IDictionary<string, object>) expando;
    dict["Do"] = new Func<string>(MyFunc);
    dict["Do2"] = new Func<string, string>(MyFunc2);

    Console.WriteLine(expando.Do());
    Console.WriteLine(expando.Do2("args"));
}

static string MyFunc()
{
    return "Do some awesome stuff";
}

static string MyFunc2(string arg)
{
    return "Do some awesome stuff with " + arg;
}

**编辑**

完全披露:这个问题似乎与String- Function dictionary c# where functions have different arguments非常相似(如果不是愚蠢),我只是以同样的方式回答。