字符串拆分后的条件概括

时间:2019-01-20 03:17:26

标签: c# asp.net .net c#-4.0

考虑一下,我的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表达式后,我不希望使用许多if,else / switch语句,这些语句具有硬编码的数字,例如1,2,3,依此类推。

如果不采用拆分实际cron表达式并将其提取的明显解决方案,是否可以使其更具可读性?

1 个答案:

答案 0 :(得分:1)

基于您的注释,您不希望发生多种情况,因此可以使用Enum避免显式索引。 If / Switch用例可以用字典代替,该字典将索引(或更好的Enum)映射到Actions(需要针对每种情况执行)。

例如,

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等表示需要在每种条件下执行的操作。