我正在开发一个个人助理程序,我有一个名为input_parse()的方法,它查看输入字符串并检查与伪代码看起来像这样的“命令”对应的单词。
if (input.contains("argA")
{//execute command A}
if (input.contains("argB") && input.contains("argC"))
{//execute command B}
是否有一种更简单的方法可以使用字符串数组命令解决此问题,然后根据参数索引对命令使用switch语句?
答案 0 :(得分:2)
您可以创建词典,其中值将是您的命令,键可以是您的字符串(arg名称)。
var myCommands = new Dictionary<string, Action>();
myCommands.Add("argA", new Action(() => Console.WriteLine("arga was passed")));
myCommands.Add("argB", new Action(() => Console.WriteLine("argb was passed")));
你可以调用你的命令迭代字典的键。因此,如果传递了argA和argB,则将调用这两个命令。
foreach (var key in myCommands.Keys)
{
if (input.Contains(key))
{
myCommands[key]();
}
}
这是最简单的方法,您不需要创建任何类结构或类似的东西。适用于简单的控制台应用程序。
修改强>
要交叉匹配参数,您可以定义以下词典。
var myCommands new Dictionary<Func<string, bool>, Action>>();
myCommands.Add(new Func<string, bool>(i => i.Contains("argA")),new Action(() => Console.WriteLine("arga was passed"));
myCommands.Add(new Func<string, bool>(i => i.Contains("argB")),new Action(() => Console.WriteLine("arga was passed"));
myCommands.Add(new Func<string, bool>(i => i.Contains("argB") && e.Contains("argA")),new Action(() => Console.WriteLine("arga & argb was passed"));
foreach (var key in myCommands.Keys)
{
if (key(input))
{
myCommands[key]();
}
}
答案 1 :(得分:1)
您拥有彼此相关的命令和输入参数。将这两个东西封装到一个对象中并使它们保持接近似乎是合乎逻辑的。您可以为这些对象创建界面
public interface ICommand
{
bool CanGetArgumentsFrom(string input);
void Execute();
}
实现它的命令
public class CommandA : ICommand
{
public bool CanGetArgumentsFrom(string input)
{
return input.Contains("argA");
}
public void Execute()
{
/* execute command A */
}
}
第二个命令
public class CommandB : ICommand
{
public bool CanGetArgumentsFrom(string input)
{
return input.Contains("argB") && input.Contains("argC");
}
public void Execute()
{
/* execute command B */
}
}
用法非常易读
ICommand[] commands = { new CommandA(), new CommandB() };
foreach(var command in commands)
if (command.CanGetArgumentsFrom(input))
command.Execute();
你甚至可以有方法
public bool TryExecuteCommand(string input)
{
if (!CanGetArgumentsFrom(input))
return false;
Execute();
return true;
}
然后执行将更加简单和可读:
foreach(var command in commands)
command.TryExecute(input);
如果您不想创建命名命令,那么您可以使用验证输入的对象,并在所有必需参数到位时执行某些操作
public class Command
{
string[] arguments;
Action action;
public Command(Action action, params string[] arguments)
{
this.action = action;
this.arguments = arguments;
}
public bool TryExecute(string input)
{
if (!arguments.All(input.Contains))
return false;
action();
return true;
}
}
现在使用这个单一类可以创建命令:
var commands = new Command[] {
new Command(_ => /* execute A */, "argA"),
new Command(_ => /* execute B */, "argB", "argC"),
};
答案 2 :(得分:0)
您可以使用IEnumerable.Any
(针对&#34;或&#34;条件&#34;)或IEnumerable.All
(针对&#34;和&#34;条件):
if (input.contains("argA"))
{//execute command A}
if (new[] { "argB", "argC" }.All(input.Contains))
{//execute command B}