C# 字典和函数

C# 字典和函数,c#,dictionary,C#,Dictionary,我最近开始使用C#,有一件事我过去用Python很容易就能做到,我想用C#实现 例如,我有一个函数,如: def my_func(): return "Do some awesome stuff" 还有一本字典,比如: my_dic = {"do": my_func} 我制作了一个脚本,当用户输入“do”时,程序将根据字典调用my_func 我想知道如何在C#dictionary中为字符串分配函数。基本上以相同的方式: static void Main() { var dict =

我最近开始使用C#,有一件事我过去用Python很容易就能做到,我想用C#实现

例如,我有一个函数,如:

def my_func():
 return "Do some awesome stuff"
还有一本字典,比如:

my_dic = {"do": my_func}
我制作了一个脚本,当用户输入“do”时,程序将根据字典调用
my_func


我想知道如何在C#dictionary中为字符串分配函数。

基本上以相同的方式:

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");
}
static void Main(){
var dict=新字典();
//将“do”映射到MyFunc
dict.Add(“do”,MyFunc);
//运行“do”
dict[“do”]();
}
静态void MyFunc(){
Console.WriteLine(“一些东西”);
}

您可以利用此处的集合初始值设定项语法

var my_dic = new Dictionary<string, Action>
{
    { "do", my_func }
};
var my\u dic=新字典
{
{“do”,my_func}
};
对于更复杂的函数,您可以将声明中的
操作
替换为相应的
函数
类型。

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

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


如果您真的想要Python的动态行为(即,能够无缝地将具有不同签名的方法分配和调用到“字典”),我会选择ExpandoObject,它专门用于使CLR支持Python等动态语言(参见IronPython等)

static void Main()
{
动态expando=新的ExpandoObject();
expando.Do=新函数(MyFunc);
expando.Do2=新函数(MyFunc2);
Console.WriteLine(expando.Do());
控制台写入线(expando.Do2(“args”);
}
静态字符串MyFunc()
{
return“做一些很棒的事情”;
}
静态字符串MyFunc2(字符串参数)
{
return“使用”+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;
}
static void Main(字符串[]args)
{
动态expando=新的ExpandoObject();
var dict=(IDictionary)expando;
dict[“Do”]=新函数(MyFunc);
dict[“Do2”]=新函数(MyFunc2);
Console.WriteLine(expando.Do());
控制台写入线(expando.Do2(“args”);
}
静态字符串MyFunc()
{
return“做一些很棒的事情”;
}
静态字符串MyFunc2(字符串参数)
{
return“使用”+arg做一些很棒的事情;
}
**编辑**


完全披露:这个问题似乎非常相似(如果不是被愚弄的话),我只是用同样的方式回答。

@SiyavashHamdi:不,你不知道。您只需要委托,如标准
操作
函数
。或
表达式
s。当然,它们在内部都是基于反射的,因为
MethodInfo
在其中的某个位置,但这与手动查找/调用它完全不同。另请参见:特别是内置的泛型委托类型(对于返回类型为
void
的方法)和(对于返回类型为非
void
的方法)以及它们的许多重载。我添加了我的答案,尽管与Evk和Adam E的答案非常相似,因为他们都没有提供与Balgy提供的示例类似的直接代码。对于普通情况,您也可以在集合初始值设定项中使用lambda语法(在某些情况下,只需编写方法组的名称)您还可以使用lambda表达式:
dict.Add(“do”,()=>Console.WriteLine(“一些东西”)。这里的关键是
Action
是一种委托类型,它指定函数不能接受任何参数,也不能返回任何结果。还有其他通用版本的
Action
允许获取参数,
Func
允许返回值。还值得注意的是,为了使其工作,所有函数都需要相同的参数集和输出类型。与Python不同,C#具有多行lambda:()=>{Console.WriteLine(“A”);Console.WriteLine(“B”)},因为它不受其创建者的“直觉”的限制。@Traubenfuchs公平地说,Python,在(我相信)
lambda
被添加到语言之前,您可以通过
def
在任何范围内执行多行函数。因此,当考虑<代码> lambda < /Cord>时,这种限制是有意义的,因为它方便了内嵌非常简单的操作,并且多表达式lambdas可能会使语法复杂化或需要大量的语法元素。相比之下,您当然不能用C#在函数作用域中定义普通函数(类的一部分),因此lambda函数在C#中比在Python中占据更多的角色。
var result = my_dic["do"]();
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;
}
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;
}