访问存储在 Action[] 字典中的多个方法
Access multiple methods stored in an Action[] dictionary
This question covers the use of actions in a dictionary. 我想做类似的事情,但每个操作 不止一种方法 :
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
};
dot
和 dash
指的是这些私有函数:
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[] 中包含的方法?
你快到了。你有一系列的动作,所以现在你需要做的就是按顺序执行动作。
C# 中的 Action
s 和 Func
s 就像任何其他对象一样 - 您可以将它们放在数组中,将它们分配给变量,将它们作为参数传递给方法,等等。唯一的区别是您可以调用 一个动作。这个语法看起来就像调用方法的语法:
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();
}
}
}
列举动作并执行。
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();
}
}
}
}
使用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.WriteLine
得到什么,但是你观察到的行为是预期的,因为WriteLine
调用ToString
对象来打印它,对于数组(以及 ToString
未被覆盖的其他类型),它只是 returns 类型名称。
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());
}
}
}
This question covers the use of actions in a dictionary. 我想做类似的事情,但每个操作 不止一种方法 :
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
};
dot
和 dash
指的是这些私有函数:
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[] 中包含的方法?
你快到了。你有一系列的动作,所以现在你需要做的就是按顺序执行动作。
C# 中的Action
s 和 Func
s 就像任何其他对象一样 - 您可以将它们放在数组中,将它们分配给变量,将它们作为参数传递给方法,等等。唯一的区别是您可以调用 一个动作。这个语法看起来就像调用方法的语法:
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();
}
}
}
列举动作并执行。
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();
}
}
}
}
使用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.WriteLine
得到什么,但是你观察到的行为是预期的,因为WriteLine
调用ToString
对象来打印它,对于数组(以及 ToString
未被覆盖的其他类型),它只是 returns 类型名称。
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());
}
}
}