Проверьте, находится ли DayOfWeek в пределах двух указанных DayOfWeek

У меня DayOfWeek, и мне нужно проверить, не находится ли этот день между двумя другими DayOfWeek переменными.

Например:

DayOfWeek monday = DayOfWeek.Monday;
DayOfWeek friday= DayOfWeek.Friday;

DayOfWeek today = DateTime.Today.DayOfWeek;

if (today is between monday and friday)
{
   ...
}

Примечание. В эти дни будет включительно. В этом случае, если день понедельник, вторник, среда, четверг и пятница, то он действителен.

Единственное, что я могу придумать, - это сделать массивный оператор if в другом методе, возможно, в методе расширения, но это не очень элегантно.

Изменить

Вот пример моих требований:

    public enum RecurringModes
    {
        Minutes,
        Hours
    }

    public RecurringModes RecurringMode { get; set; }
    public int RecurringValue { get; set; }

    ... 

    public IEnumerable<DateTime> AllDueDatesToday()
    {
        //Get the current date (starting at 00:00)
        DateTime current = DateTime.Today;

        //Get today and tomorrow's day of week.
        DayOfWeek today = current.DayOfWeek;
        DayOfWeek tomorrow = current.AddDays(1).DayOfWeek;

        //If it isn't in the date range, then return nothing for today.
        if (!IsInDateRange(today, StartingOn, EndingOn))
            yield break;

        while (current.DayOfWeek != tomorrow)
        {
            //Check the selected recurring mode
            switch (RecurringMode)
            {
                //If it's minutes, then add the desired minutes
                case RecurringModes.Minutes:
                    current = current.AddMinutes(RecurringValue);
                    break;
                //If it's hours, then add the desired hours.
                case RecurringModes.Hours:
                    current = current.AddHours(RecurringValue);
                    break;
            }

            //Add the calculated date to the collection.
            yield return current;
        }
    }

    public bool IsInDateRange(DayOfWeek day, DayOfWeek start, DayOfWeek end)
    {
        //if they are all the same date
        if (start == end && start == day)
            return true;

        //This if statement is where the problem lies.
        if ((start <= end && (day >= start && day <= end)) ||
            (start > end && (day <= start && day >= end)))
            return true;
        else return false;
    }

Фактически, метод AllDueDatesToday() вернет список из DateTime, который представляет расписание на сегодня.


person Mike Eason    schedule 22.07.2015    source источник


Ответы (2)


Вы можете сравнивать перечисления, как если бы они были числами:

if (today >= monday && today <= friday) {

Как указывает @Tyrsius, это работает только потому, что monday < friday. Итак, технически вам нужно сначала проверить это:

if ((monday <= friday && (today >= monday && today <= friday)) ||
    (monday > friday  && (today <= monday && today >= friday))) {

Обратите внимание, что неделя .NET начинается в воскресенье: DayOfWeek.Sunday равно 0.

Если вы хотите, чтобы ваша неделя начиналась в понедельник, вам нужно выполнить некоторые арифметические операции.

var lowLimit = ((int)monday + 6) % 7;
var highLimit = ((int)friday + 6) % 7;
var valueToCheck = ((int)today + 6) % 7;

if ((lowLimit <= highLimit && (valueToCheck >= lowLimit && valueToCheck <= highLimit)) ||
    (lowLimit > highLimit  && (valueToCheck <= lowLimit && valueToCheck >= highLimit))) {
person Glorfindel    schedule 22.07.2015
comment
На самом деле это не работает, поскольку числа не переносятся. Это не сработает, например, в понедельник между субботой и вторником. - person Kyeotic; 22.07.2015
comment
Я не уверен, что ваш второй оператор if работает правильно. Я запустил его, используя переменную сегодня, равную Wednesday, дату начала (переменная понедельника), равную Monday, и дату окончания (переменная пятницы), равную Sunday. К сожалению, не повезло. - Я обновлю вопрос, чтобы предоставить дополнительную информацию. - person Mike Eason; 22.07.2015
comment
Неделя .NET начинается в воскресенье. - person Glorfindel; 22.07.2015
comment
Ах! Работает как шарм. Спасибо. - person Mike Eason; 22.07.2015

Как уже упоминалось, вы можете использовать перечисления в логических сравнениях, но есть проблема, когда значения не переносятся. И порядок конечных точек имеет значение. Например, «Понедельник между субботой и вторником» должен возвращать true, тогда как «Понедельник между вторником и субботой» должен возвращать false.

public static bool IsBetween(this DayOfWeek weekday, DayOfWeek inclusiveStart, DayOfWeek inclusiveEnd)
{
    if (inclusiveStart <= inclusiveEnd)
    {
        return (weekday >= inclusiveStart) && (weekday <= inclusiveEnd);
    }
    return (weekday >= inclusiveStart) || (weekday <= inclusiveEnd);
}

Это должно сработать. Есть и другие способы сделать это, но это один из способов.

person Rick Davin    schedule 22.07.2015