简化使用if的多个if语句(string.contains())
我正在开发一个个人助理程序,我有一个名为input_parse()的方法,它查看输入字符串并检查与伪代码看起来像这样的“命令”对应的单词。
if (input.contains("argA") {//execute command A} if (input.contains("argB") && input.contains("argC")) {//execute command B}
是否有一种更简单的方法来解决这个问题,可能是使用字符串数组的命令,然后根据参数的索引使用switch语句?
您可以创建一个Dictionary ,其中值将是您的命令,键可以是您的字符串(arg名称)。
var myCommands = new Dictionary(); 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, Action>>(); myCommands.Add(new Func(i => i.Contains("argA")),new Action(() => Console.WriteLine("arga was passed")); myCommands.Add(new Func(i => i.Contains("argB")),new Action(() => Console.WriteLine("arga was passed")); myCommands.Add(new Func(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](); } }
您有相互关联的命令和输入参数。 将这两个东西封装到一个对象中并使它们保持接近似乎是合乎逻辑的。 您可以为这些对象创建界面
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);
如果您不想创建命名命令,那么您可以使用validation输入的对象,并在所有必需参数都到位的情况下执行某些操作
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"), };
您可以使用IEnumerable.Any
(用于“或”条件“)或IEnumerable.All
(用于”和“条件):
if (input.contains("argA")) {//execute command A} if (new[] { "argB", "argC" }.All(input.Contains)) {//execute command B}