выберите день из периода - повторение - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь реализовать шаблон повторения для моего приложения календаря. Я хочу, чтобы он работал так же, как Outlook, когда вы назначаете встречу с повторением.

public async Task<ValidationResponse<ReccurrenceModel>> ApplyReccurrencePeriod (string userName, ReccurrenceModel value)
        {
            var user = await repository.FindByUserName(userName);

            var fromDateUTC = DateTime.SpecifyKind(value.FromDate, DateTimeKind.Utc);
            var toDateUTC = DateTime.SpecifyKind(value.ToDate, DateTimeKind.Utc);

            var dates = new List<DateTime>();
            var weeklyReccurrence = value.weeklyReccurrence;

            if (value.IsMonday == true)
            {
                var fromDate = value.FromDate;
                var toDate = value.ToDate;
                for (var dt = fromDate; dt < toDate; dt = dt.AddDays(1))
                {
                    dates.Add(dt);
                }
                var savedDates = dates.Where(x => x.DayOfWeek == DayOfWeek.Monday).Select(x => x.Date);
            }
// I do the same code to verify every week day 

                var test = dates.Where(x => x.DayOfWeek == DayOfWeek.Friday).Select(x => x.Date);
            }

            foreach (var date in savedDates) {
                var x = user.Holidays.FirstOrDefault(kvp => kvp.Key == date
                                     && kvp.Value.StateVal == value.State.StateVal);

                var dateUTC = DateTime.SpecifyKind(date, DateTimeKind.Utc);

                user.Holidays[dateUTC] = value.State;

            }
            // save
            var updatedUser = await repository.UpdateEmployee(user);
            return await Task.FromResult(new ValidationResponse<HolidayModel>()
            {
                IsValid = true,
                Result = updatedUser.Holidays.ContainsKey(dateUTC) ? new HolidayModel() { Date = dateUTC, State = updatedUser.Holidays[dateUTC] } : null
            });

        }
    }

Проблема с моим кодом заключается в том, что он работает только в случае еженедельного повторения. Мне нужно, чтобы это работало, чтобы повторение продолжалось 2, 3, ... n недель. Как я могу пропустить несколько недель?

 public class ReccurrenceModel
    {
        public DateTime FromDate { get; set; }
        public DateTime ToDate { get; set; }
        public int WeeklyReccurrence { get; set; }
        public State State { get; set; }
        public bool IsMonday { get; set; }
        public bool IsTuesday { get; set; }
        public bool IsWednesday { get; set; }
        public bool IsThursday { get; set; }
        public bool  IsFriday { get; set; }
        public DateTime FromDateToReturn { get; set; }
        public DateTime ToDateToReturn { get; set; }
    }

1 Ответ

0 голосов
/ 31 октября 2018

Код немного запутан, есть много строк, которые вообще ничего не делают.

Здесь я привожу пример кода, который, хотя и не совсем элегантный, предоставляет вам необходимое поведение, следующий код создаст список дней, которые повторяются каждые 2, 3, независимо от того, какие вам нужны недели, которые вы определяете в его зов.

Этот метод также принимает список DayOfWeek, для которого вы хотите создать повторение

private static void GetRecurrentDays(DateTime fromDate, DateTime untilDate, uint weeklyRecurrence, List<DayOfWeek> recurrenceDays)
{
    var recurrenceDates = new List<DateTime>();
    for (var dt = fromDate; dt < untilDate; dt = dt.AddDays(1))
    {
        if (recurrenceDays.Any(day => day.Equals(dt.DayOfWeek)))
        {
            var lastDate = 
                recurrenceDates
                    .LastOrDefault(date => date.DayOfWeek.Equals(dt.DayOfWeek));

            // We multiply 7 days (a week) with weeklyRecurrence to 
            // calculate the appropiate date in which to add another day, 
            // calling with either 0 or 1 will calculate a weekly 
            // schedule
            if (lastDate.Equals(DateTime.MinValue) 
                || weeklyRecurrence.Equals(0)
                || ((dt - lastDate).Days % (7 * weeklyRecurrence)).Equals(0) )
            {
                recurrenceDates.Add(dt);
            }
        }
    }
}

вы можете встроить этот код в свой код, чтобы получать дни с еженедельным повторением, а затем использовать их в своем коде

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