Самый элегантный способ изменить эту последовательность - PullRequest
1 голос
/ 14 апреля 2010

У меня есть день недели, хранящийся в таблице базы данных (которую я не контролирую), и мне нужно использовать его в своем коде.

Проблема в том, что я хочу использовать перечисление System.DayOfWeek для представления этого, и последовательности не совпадают.

В базе данных это выглядит следующим образом:

1  2  3  4  5  6  7
S  M  T  W  T  F  S

Мне нужно это следующим образом:

0  1  2  3  4  5  6
M  T  W  T  F  S  S

Какой самый элегантный способ сделать это?

например, я мог бы сделать:

i = dayOfWeek;
i = i - 2;
if (i < 0) {
    i = 6;
}

но это немного не элегантно. Есть предложения?

гм. Очевидно (.net рефлектор говорит) DayOfWeek индексируется 0, начиная с воскресенья.

Всегда читайте документы, прежде чем задавать глупые вопросы.

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

Ответы [ 4 ]

5 голосов
/ 14 апреля 2010

Значение, которое вы хотите

(DayOfWeek)((dbDay + 5) % 7)

с использованием оператора по модулю %.

3 голосов
/ 14 апреля 2010

Оберните это в функцию:

public int DbToDayOfWeek(int dbDay)
{
   if (dbDay == 1)
     return 6;

   return dbDay  -2;

}

Или:

public DayOfWeek DbToDayOfWeek(int dbDay)
{
   if (dbDay == 1)
     return DayOfWeek.Sunday;

   return (DayOfWeek)(dbDay - 2);

}
0 голосов
/ 14 апреля 2010

Вы можете просто создать свой собственный enum и отобразить перечисление непосредственно в значение в базе данных

public enum DayOfWeek
{
    Mon = 2,
    Tue = 3,
    Wed = 4,
    Thu = 5,
    Fri = 6,
    Sat = 7,
    Sun = 1
}

Тогда вы можете использовать метод расширения вашего типа DayOfWeek для получения значения:

public static int ToInt(this DayOfWeek dow)
{
    return (int)dow;   
}

Если вы не используете DayOfWeek для фактического сравнения с датами, в противном случае вам придется выполнить преобразование между смещениями.

0 голосов
/ 14 апреля 2010

Хотя я не могу себе представить, что значения меняются, вам действительно следует избегать предположения, что перечисленные значения DayOfWeek останутся прежними - поэтому кодируйте соответственно.

static DayOfWeek[] _toDaysTable = new DayOfWeek[] {
    DayOfWeek.Sunday, DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday,
    DayOfWeek.Thursday, DayOfWeek.Friday, DayOfWeek.Saturday
};

static DayOfWeek ToDayOfWeek(int myDayOfWeek)
{
     int index = myDayOfWeek - 1;
     if (index < 0 || index >= _toDaysTable.Length)
          throw new ArgumentOutOfRangeException("myDayOfWeek");
     return _toDaysTable[index];
}

static int FromDayOfWeek(DayOfWeek day)
{
    int index = Array.IndexOf(_toDaysTable, day);
    if (index < 0)
        throw new ArgumentOutOfRangeException("day");
    return index + 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...