2010-04-14 3 views
1

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

Проблема в том, что я хочу использовать перечисление 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; 
} 

, но это немного безвкусный. Какие-либо предложения?

< EDIT>

Гм. По-видимому (рефлектор .net говорит) DayOfWeek индексируется 0 с воскресенья.

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

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

</EDIT>

+0

На каком языке это? –

+0

@Sebastion: Я думал об этом сам, заметил перечисление 'DayOfWeek', которое можно было использовать на нескольких языках .NET, поэтому просто помечало его в общем. – James

+0

о, извините. Я не думал, что этот язык уместен, поэтому я его оставил. C#! –

ответ

5

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

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

с помощью оператора по модулю %.

3

Заверните его в функции:

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

Выполнено, конечно, все это своя маленькая функция в моей кодовой базе. Более заинтересованный в последовательности warp, должен быть хороший способ математики для достижения этого! –

+0

@ Эд Вудкок - Ничего не могу придумать. Закрывается вещь +5% 7, которую @AakashM опубликовал. – Oded

0

Хотя я не могу представить, как изменяются значения, вам действительно следует избегать предполагать, что перечисленные значения 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; 
} 
+0

Я считаю, что в этом случае можно с уверенностью предположить, что значения останутся неизменными, поскольку указано в документации: «... варьируется от нуля (что указывает на DayOfWeek.Sunday) до шести (что указывает на DayOfWeek.Saturday)». http://msdn.microsoft.com/en-us/library/system.dayofweek.aspx – LukeH

0

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

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 для фактических сравнений с датами, в противном случае вам нужно будет сделать преобразование между смещениями.

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