Обобщение условий после расщепления строки - PullRequest
0 голосов
/ 20 января 2019

Предположим, у меня есть выражение 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
 }
}

Как мне обобщить вышеуказанную функцию, чтобы я не хотел использовать много операторов if else / switch с жестко закодированными числами, такими как 1,2,3 и т. Д.после деления выражения cron.

Можно ли сделать его более читабельным без очевидного решения разделения действительного выражения cron и его извлечения?

1 Ответ

0 голосов
/ 20 января 2019

Исходя из ваших комментариев о том, что вы не ожидаете более одного условия, вы можете избежать явных индексов, используя Enum. Случаи If / Switch могут быть заменены словарем, который отображает индексы (или лучше Enum) в действия (которые необходимо выполнить для каждого случая).

Например,

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 и т. Д. Представляют действия, которые необходимо выполнить при каждом условии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...