代码之家  ›  专栏  ›  技术社区  ›  user1907849

字符串分裂后条件的推广

  •  0
  • user1907849  · 技术社区  · 6 年前

    假设我有一个cron表达式为“***/2”* “如果不是,我必须按天、小时和分钟提取重复” " . 我有下面的功能,这也是工作。

    public void CronDivision(string cron)
    {
    string days, value;
     string[] cronDiv = cron.split(' ');
     if(cronDiv[2] != "*")
     {
      days = "Days"
      value = cronDiv[2].split('/')[1];
     }
     else if(cron[1] != "*)
     {
      //Similar logic
     }
     else if(cron[0] != "*)
     {
      //Similar logic
     }
     else if(cron[3] != "*)
     {
      //different logic for extracting weeks
     }
    else if(cron[4] != "*)
     {
      //different logic for extracting years
     }
    }
    

    如何对上述函数进行泛化,以便在对cron表达式进行除法之后,不想使用许多带有硬编码数字(如1、2、3等)的if-else/switch语句。

    如果没有明显的拆分实际cron表达式并提取它的解决方案,它能变得更可读吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Anu Viswan    6 年前

    基于您不希望出现多个条件的注释,可以使用Enum避免显式索引。If/Switch案例可以替换为字典,字典将索引(或更好的枚举)映射到操作(需要为每个案例执行)。

    var cron =  "* * */2 * ";
    var arr = cron.Split(new[]{" "},StringSplitOptions.RemoveEmptyEntries);
    var value = arr.Select((x,index)=>new {Value=x, Index=index}).First(x=>!x.Value.Equals("*"));
    var dictionaryOfActions = new Dictionary<Position,Action>
    {
        [Position.Minute] = ()=> ProcessMinute(),
        [Position.Hour] = ()=> ProcessHour(),
        [Position.Day] = ()=> ProcessDay(),
    };
    dictionaryOfActions[(Position)value.Index]();
    

    public enum Position
    {
        Minute,
        Hour,
        Day 
    }
    

    ProcessMinute、ProcessHour等表示需要在每个条件下执行的操作。