2015-09-28 3 views
4

Есть ли способ подвести этот код на 1-2 строки?DayOfWeek получить следующий DayOfWeek (понедельник, вторник ... воскресенье)

Моя цель - вернуть, например, у меня есть 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; 
     } 

ответ

4

Да.

(DayOfWeek)((int)(_RESETDAY+1)%7) 
9

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

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

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

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

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

+0

Это лучший вариант. Он учитывает переход с субботы на воскресенье –

+0

Это отлично работает! благодаря! – Katherine

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

Например

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

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

+0

Вы проверили это? – user1666620

+0

Да, я заметил проблему с субботой, потому что здесь неделя начинается в понедельник, но я отредактировал – Mulflar

2

же результат сложения и по модулю вещи ответил выше, но более читаемым IMHO:

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

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

0

общий случай решение использует по модулю arithemtics:

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); 

, вероятно, лучший implmentation состоит в скрыть формулу combersome в методе расширения:

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); 
+1

Я думаю, что есть два слишком много 7. –

+0

@Ian Newson: когда 'shift <0', то'% 7' может возвращать * отрицательное значение * - поэтому '+ 7' (и второй'% 7') следует добавить –

+0

А я вижу ..... .. –

Смежные вопросы