2010-04-14 2 views
1

J'ai le jour de la semaine stocké dans une table de base de données (que je ne contrôle pas), et j'ai besoin de l'utiliser dans mon code.Le moyen le plus élégant de morphiser cette séquence

Le problème est, je veux utiliser l'énumération System.DayOfWeek pour la représentation pour cela, et les séquences ne sont pas les mêmes.

Dans la base de données, il est comme suit:

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

J'ai besoin comme suit:

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

Quelle est la façon la plus élégante de le faire?

par exemple, je pouvais faire:

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

mais c'est un peu inélégante. Aucune suggestion?

< EDIT>

Ahem. Apparemment (réflecteur .net dit) DayOfWeek est 0 indexé en commençant par dimanche.

Toujours lire les documents avant de poser des questions.

Cependant, je suis toujours intéressé par une réponse, juste pour satisfaire ma propre curiosité, alors allez-y.

</EDIT>

+0

Dans quelle langue est-ce? –

+0

@Sebastion: Je pensais que moi-même, j'ai remarqué l'enum 'DayOfWeek' qui pourrait être utilisé dans plusieurs langages .NET, donc je l'ai juste étiqueté génériquement. – James

+0

oh, désolé. Je ne pensais pas que le langage était pertinent, alors je l'ai laissé de côté. C#! –

Répondre

5

La valeur que vous voulez est

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

en utilisant l'opérateur modulo %.

3

envelopper dans une fonction:

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

    return dbDay -2; 

} 

Ou:

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

    return (DayOfWeek)(dbDay - 2); 

} 
+0

Fait naturellement, tout est sa propre petite fonction dans mon code. Plus intéressé par la chaîne de séquence, il doit y avoir une belle façon mathématique d'y parvenir! –

+0

@Ed Woodcock - Rien que je puisse penser. La chose la plus proche est le +5% 7 que @AakashM a posté. – Oded

0

Bien que je ne puisse pas imaginer que les valeurs changent, vous devriez vraiment éviter de supposer que les valeurs énumérées DayOfWeek resteront les mêmes - donc codez en conséquence.

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

Je suppose que dans ce cas, il est assez sûr de supposer que les valeurs resteront les mêmes car il est indiqué dans la documentation: "... va de zéro (ce qui indique DayOfWeek.Sunday) à six (ce qui indique DayOfWeek.Saturday)." http://msdn.microsoft.com/en-us/library/system.dayofweek.aspx – LukeH

0

Vous pouvez simplement créer votre propre ENUM et cartographier l'ENUM directement à la valeur de la base de données

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

Ensuite, vous pouvez utiliser une méthode d'extension de votre type DayOfWeek pour récupérer la valeur:

Sauf si vous comptez sur le DayOfWeek pour des comparaisons réelles avec des dates, sinon vous devrez faire la conversion entre les décalages.