字典和功能

Bal*_*lgy 25 c# dictionary

我最近开始使用C#,我曾经想在C#中轻松完成一些我想要实现的东西.

例如,我有一个像这样的功能:

def my_func():
 return "Do some awesome stuff"
Run Code Online (Sandbox Code Playgroud)

还有一本字典:

my_dic = {"do": my_func}
Run Code Online (Sandbox Code Playgroud)

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

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

Evk*_*Evk 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");
}
Run Code Online (Sandbox Code Playgroud)

  • 你也可以做lambda表达式:`dict.Add("do",()=> Console.WriteLine("some stuff"));`.这里的关键是`Action`是一个委托类型,它指定该函数必须不带参数并且不返回任何结果.还有其他通用版本的`Action`允许接受参数,而`Func`允许返回一个值.另外值得注意的是,为了使其工作,所有函数都需要相同的参数集和输出类型. (3认同)

Ada*_*m E 18

您可以在此处利用集合初始值设定程序语法.

var my_dic = new Dictionary<string, Action>
{
    { "do", my_func }
};
Run Code Online (Sandbox Code Playgroud)

对于更复杂的函数,您可以Action使用适当的Function类型替换声明.


And*_*nce 5

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

string my_func() {
  return "Do some awesome stuff";
}
Run Code Online (Sandbox Code Playgroud)

和:

var my_dic = new Dictionary<string, Func<string>> {
  { "do", my_func },
};
Run Code Online (Sandbox Code Playgroud)

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

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

var result = my_dic["do"]();
Run Code Online (Sandbox Code Playgroud)