Подтвердить что ты не робот

Словари и функции

Недавно я начал работать с С#, и в Python я использовал что-то, что я хотел бы сделать в С#.

Например, у меня есть функция вроде:

def my_func():
 return "Do some awesome stuff"

И словарь вроде:

my_dic = {"do": my_func}

Я сделал script, в котором, когда пользователь вводит "делать", программа будет вызывать my_func в соответствии со словарем.

Я хотел бы знать, как я могу назначать функции для строк в словаре С#.

4b9b3361

Ответ 1

Точно так же:

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");
}

Ответ 2

Здесь вы можете воспользоваться синтаксисом инициализатора коллекции.

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

Для более сложных функций вы замените Action в объявлении соответствующим типом Function.

Ответ 3

Фрагменты кода С#, которые будут наиболее непосредственно аналогичны вашим примерам:

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

и

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

Трюк, как указывали другие плакаты, заключается в создании строки, общий тип которой имеет либо действие (которое является методом, возвращающим void), либо Func <T> (который является методом, возвращающим объект типа T).

В любом случае вы можете выполнить этот метод с помощью:

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

Ответ 4

Если вы действительно хотите динамическое поведение Python (то есть можете легко назначать и вызывать методы, которые имеют разные подписи для словаря), я бы пошел с 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;
}

** Изменить **

Полное раскрытие: этот вопрос кажется очень похожим (если не обманом) слова Cring-Function С#, где функции имеют разные аргументы, на которые я ответил точно так же.