DayOfWeek получить следующий DayOfWeek (понедельник, вторник, воскресенье)

Есть ли способ обобщить этот код в 1-2 строки?

Моя цель - вернуться, например, у меня есть DayOfWeek, который является понедельником, я хочу получить следующий день (вторник) или n дней после этого.

         switch (_RESETDAY)
        {
            case DayOfWeek.Monday:
                _STARTDAY = DayOfWeek.Tuesday;
                break;
            case DayOfWeek.Tuesday:
                _STARTDAY = DayOfWeek.Wednesday;
                break;
            case DayOfWeek.Wednesday:
                _STARTDAY = DayOfWeek.Thursday;
                break;
            case DayOfWeek.Thursday:
                _STARTDAY = DayOfWeek.Friday;
                break;
            case DayOfWeek.Friday:
                _STARTDAY = DayOfWeek.Saturday;
                break;
            case DayOfWeek.Saturday:
                _STARTDAY = DayOfWeek.Sunday;
                break;
            case DayOfWeek.Sunday:
                _STARTDAY = DayOfWeek.Monday;
                break;
            default:
                _STARTDAY = DayOfWeek.Tuesday;
                break;
        }

person Katherine    schedule 28.09.2015    source источник


Ответы (5)


Это просто перечисление int, от воскресенья (0) до субботы (6), согласно MSDN:

Перечисление DayOfWeek представляет день недели в календарях, в которых семь дней в неделю. Значение констант в этом перечислении находится в диапазоне от DayOfWeek.Sunday до DayOfWeek.Saturday. Если привести к целому числу, его значение находится в диапазоне от нуля (что указывает DayOfWeek.Sunday) до шести (что указывает DayOfWeek.Saturday).

Так что простая математика должна сделать это:

DayOfWeek nextDay = (DayOfWeek)(((int)_RESETDAY + 1) % 7);

Замените + 1 на + n, если это то, что вам нужно.

person Andrei    schedule 28.09.2015
comment
Это лучший. Это связано с переходом с субботы на воскресенье - person David P; 28.09.2015

Да.

(DayOfWeek)((int)(_RESETDAY+1)%7)
person Ian Newson    schedule 28.09.2015

тот же результат, что и при добавлении и по модулю, выше, но более читаемый imho:

day = (day == DayOfWeek.Saturday) ? DayOfWeek.Sunday : day + 1;

Очевидное намерение кода всегда приятнее.

person Jonesopolis    schedule 28.09.2015

    static DayOfWeek dayplus (DayOfWeek day)
    {
        if (day == DayOfWeek.Saturday)
            return DayOfWeek.Sunday;
        else
            return day + 1;
    }

Например

Console.WriteLine(dayplus(DayOfWeek.Sunday));

вернется в понедельник

person Mulflar    schedule 28.09.2015
comment
Да, я заметил проблему с субботой, потому что здесь неделя начинается с понедельника, но я отредактировал - person Mulflar; 28.09.2015

Решение для общего случая использует арифметику по модулю:

  DayOfWeek _RESETDAY = ...;
  int shift = 1; // can be positive or negative

  // + 7) % 7 to support negative shift´s
  DayOfWeek result = (DayOfWeek) ((((int)_RESETDAY + shift) % 7 + 7) % 7);

возможно, наилучшая реализация — скрыть составную формулу в методе расширения:

 public static class DayOfWeekExtensions {
   public static DayOfWeekShift(this DayOfWeek value, int shift) {
     return (DayOfWeek) ((((int)value + shift) % 7 + 7) % 7);
   }
 }

 ...

 var result = _RESETDAY.Shift(1);

и немного уменьшенный (работает только во всех случаях, если отрицательный сдвиг не ниже -7):

     return (DayOfWeek)(((int)value + shift + 7) % 7);
person Dmitry Bychenko    schedule 28.09.2015
comment
@Ian Newson: когда shift < 0, то %7 может возвращать отрицательное значение, поэтому следует добавить +7 (и второе % 7) - person Dmitry Bychenko; 28.09.2015