1

这个问题涵盖了字典中动作的使用。我想做类似的事情,但每个操作有多个方法:

static readonly Dictionary<char, Action[]> morseDictionary = new Dictionary<char,Action[]>
        {
            { 'a', new Action[] {dot, dash} },
            { 'b', new Action[] {dash, dot, dot, dot} },
            { 'c', new Action[] {dash, dot, dash, dot} },
            { 'd', new Action[] {dash, dot, dot} },
            { 'e', new Action[] {dot} }
            // etc
        };

dotdash参考这些私有函数:

private static void dash(){
    Console.Beep(300, timeUnit*3);
}

private static void dot(){
    Console.Beep(300, timeUnit);
}

我还有另一个函数 ,morseThis它旨在将消息字符串转换为音频输出:

private static void morseThis(string message){
    char[] messageComponents = message.ToCharArray();
    if (morseDictionary.ContainsKey(messageComponents[i])){
        Action[] currentMorseArray = morseDictionary[messageComponents[i]];
        Console.WriteLine(currentMorseArray); // prints "System.Action[]"
    }       
}

在上面的示例中,我能够为输入消息中包含的每个字母将“System.Action[]”打印到控制台。但是,我的意图是currentMorseArray按顺序调用其中的方法。

如何访问字典中给定 Action[] 中包含的方法?

4

4 回答 4

2

你快到了。你有一系列动作,所以现在你需要做的就是按顺序执行这些动作。

ActionC# 中的 s 和Funcs 就像任何其他对象一样 - 您可以将它们放入数组中,将它们分配给变量,将它们作为参数传递给方法,等等。唯一的区别是你可以调用一个动作。它的语法看起来就像调用方法的语法:

Action myAction = ...
myAction();  // call the action

因此,要执行数组中的操作,您可以foreach将数组向下一一拉出,然后在循环体中调用每个操作。

private static void morseThis(string message)
{
    char[] messageComponents = message.ToCharArray();

    if (morseDictionary.ContainsKey(messageComponents[i]))
    {
        Action[] currentMorseArray = morseDictionary[messageComponents[i]];

        foreach (Action action in currentMorseArray)
        {
            action();
        }
    }       
}
于 2015-10-20T16:15:57.057 回答
2

枚举动作并执行它们。

private static void morseThis(string message)
{
    char[] messageComponents = message.ToCharArray();

    foreach(char c in messageComponents)
    {
        Action[] actions;

        if (morseDictionary.TryGetValue(c, out actions))
        {
            foreach(Action action in actions)
            {
              action();
            }
        }
    }
}
于 2015-10-20T16:17:21.123 回答
2

用于foreach迭代动作数组:

private static void morseThis(string message){
    char[] messageComponents = message.ToCharArray();
    Action[] currentMorseArray;
    if (morseDictionary.TryGetValue(messageComponents[i], out currentMorseArray))
    {
        foreach(var action in currentMorseArray)
        {
            action();
        }
    }       
}

我不确定您. _ _Console.WriteLineWriteLineToStringToString

于 2015-10-20T16:18:34.497 回答
0
static readonly Dictionary<char, List<Action>> morseDictionary = new Dictionary<char,List<Action>>
        {
            { 'a', new List<Action> {dot, dash} },
            { 'b', new List<Action> {dash, dot, dot, dot} },
            { 'c', new List<Action> {dash, dot, dash, dot} },
            { 'd', new List<Action> {dash, dot, dot} },
            { 'e', new List<Action> {dot} }
            // etc
        };

private static void morseThis(string messageSrc)
{
    foreach(char message in messageSrc.ToCharArray())
    {
        List<Action> currentMorseArray;
        if (morseDictionary.TryGetValue(message, out currentMorseArray))
        {
            currentMorseArray.ForEach(x=>x());
        }   
    }    
}
于 2015-10-20T16:25:13.153 回答