繁体   English   中英

简化多个使用if(string.contains())的if语句

[英]Simplify multiple if statements that use 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<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]();
   }
}

您有彼此相关的命令和输入参数。 在我看来,将这两件事封装到一个对象中并保持它们紧密是合乎逻辑的。 您可以为此类对象创建界面

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

您可以使用IEnumerable.Any (用于“或”条件”)或IEnumerable.All (用于“和”条件):

if (input.contains("argA"))
   {//execute command A}
if (new[] { "argB", "argC" }.All(input.Contains))
   {//execute command B}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM