Как эффективно генерировать список на основе пользовательских шаблонов?

#c# #datetime

Вопрос:

Я создаю веб-приложение, которое может отображать даты в календаре на основе «Шаблона», который может выбрать пользователь. Это элементы управления выбором шаблона из веб-интерфейса

введите описание изображения здесь

Теперь, как только он выберет шаблон, он может нажать кнопку «Сгенерировать даты», и на сервер будет отправлен вызов API для расчета дат на основе выбора шаблона.

  • Я смог сгенерировать даты, когда пользователь выбирает Pattern Mode= «ДЕНЬ» и «НЕДЕЛЯ» с помощью приведенного ниже кода.
  • Я не смог справиться с тем, когда он выбирает «МЕСЯЦ» или » ГОД » в качестве режима PetternMode
  • Когда он выбирает «Месяц» в качестве режима шаблона и «День месяца» в качестве ограничения => я смог сгенерировать даты, если значение шаблона=1. Когда он меняет значение шаблона на 2 или что-то в этом роде, оно ломается.
  • Как обращаться с такими шаблонами, как «Каждые 2 месяца», «Каждую вторую субботу» и т. Д..
  • Существует ли какая-либо библиотека или способ повысить эффективность этого кода? (Наименьший приоритет)

Это то, что я пытался

     public static List<DateTime> GenerateUpcomingDates(this Repeat repeat, DateTime from, DateTime till)
    {
        List<DateTime> result = new List<DateTime>();

        //DAY MODE
        if(repeat.PatternMode == PATTERNMODE.Day)
        {
            while(from <= till)
            {
                result.Add(from);
                from = from.AddDays(repeat.PatternValue);
            }
            return resu<
        }

        //WEEK MODE
        else if (repeat.PatternMode == PATTERNMODE.Week)
        {
            while (from <= till)
            {
                if(repeat.Sunday amp;amp; from.DayOfWeek == DayOfWeek.Sunday)
                {
                    result.Add(from);
                }
                if (repeat.Monday amp;amp; from.DayOfWeek == DayOfWeek.Monday)
                {
                    result.Add(from);
                }
                if (repeat.Tuesday amp;amp; from.DayOfWeek == DayOfWeek.Tuesday)
                {
                    result.Add(from);
                }
                if (repeat.Wednesday amp;amp; from.DayOfWeek == DayOfWeek.Wednesday)
                {
                    result.Add(from);
                }
                if (repeat.Thursday amp;amp; from.DayOfWeek == DayOfWeek.Thursday)
                {
                    result.Add(from);
                }
                if (repeat.Friday amp;amp; from.DayOfWeek == DayOfWeek.Friday)
                {
                    result.Add(from);
                }
                if (repeat.Saturday amp;amp; from.DayOfWeek == DayOfWeek.Saturday)
                {
                    result.Add(from);
                }
                from = from.AddDays(repeat.PatternValue);
            }
            return resu<
        }

        //MONTH MODE
        if (repeat.PatternMode == PATTERNMODE.Month)
        {
            if (repeat.Constrain == CONSTRAIN.DayOfMonth)
            {
                //This works only when patternValue=1
                while (from <= till)
                {
                    if(from == new DateTime(from.Year, from.Month, repeat.DayOfMonth))
                    {
                        result.Add(from);
                    }                        
                    from = from.AddDays(1);
                }
                return resu<
            }
            else if (repeat.Constrain == CONSTRAIN.Logical)
            {
                //Not working...
            }
        }
        return new List<DateTime>();
    }

    //YEAR MODE
    // Not implemented...
}
 

This is how I call the above extension method (to generate a list of dates for the next 1 year starting from one date)

 var UpcomingDates = repeat.GenerateUpcomingDates(repeat.StartBy, repeat.StartBy.AddYears(1))
 

This is the result so far I can achieve

введите описание изображения здесь

Это класс ПЕРЕЧИСЛЕНИЯ и повторения

 public class Repeat
{
    public int Id { get; set; }
    public int ActivityId { get; set; }
    public COURSE Course { get; set; }
    public int PatternValue { get; set; }
    public PATTERNMODE PatternMode { get; set; }
    public bool Sunday { get; set; }
    public bool Monday { get; set; }
    public bool Tuesday { get; set; }
    public bool Wednesday { get; set; }
    public bool Thursday { get; set; }
    public bool Friday { get; set; }
    public bool Saturday { get; set; }
    public CONSTRAIN Constrain { get; set; }
    public int DayOfMonth { get; set; }
    public LOGICALSTART LogicalStart { get; set; }
    public DAY LogicalDay { get; set; }
    public DateTime StartBy { get; set; }
    public TIMEMODE TimeMode { get; set; }
    public DateTime SpecificTime { get; set; }
    public DateTime UpdatedOn { get; set; }
}

public enum COURSE
{
    OneTime=1,
    SeveralTimes=2
}
public enum PATTERNMODE
{
    Day=1,
    Week=2,
    Month=3,
    Year=4
}
public enum CONSTRAIN
{
    DayOfMonth=1,
    Logical=2,
}
public enum LOGICALSTART
{
    First=1,
    Second=2,
    Third=3,
    Fourth=4,
    Last=0
}
public enum DAY
{
    Sunday=1,
    Monday=2,
    Tuesday=3,
    Wednesday=4,
    Thursday=5,
    Friday=6,
    Saturday=7,
}
public enum TIMEMODE
{
    Adaptive=1,
    Specific=2
}
 

Комментарии:

1. Пожалуйста, укажите код для Repeat , PATTERNMODE , TIMEMODE , и CONSTRAIN .

2. PATTERNMODE и CONSTRAIN-это перечисления, я добавил их на скриншоте выше в скобках

3. Время, необходимое для написания «РЕЖИМ ШАБЛОНА и ОГРАНИЧЕНИЕ-это перечисления, я добавил их на скриншоте выше в скобках», вероятно, больше, чем время, необходимое для копирования и вставки вашего кода.

4. Спасибо. Мы будем очень признательны, если мы сможем запустить ваш код.

5. raboof.com/projects/ncrontab также выглядит действительно полезным преобразовать синтаксис cron в нужные вам случаи в .net