2016-01-15 1 views
2

Je travaille sur un projet avec TimeDomains. Dans ce projet, un TimeDomain doit être transformé en texte écrit.
Par exemple, le domaine temporel suivant est passé comme une chaîne: [[(t2){d5}]*[(h16){h2}]]déterminer le jour de la semaine en fonction des chiffres

  • t est le jour de la semaine avec t1 étant dimanche
  • d est le nombre de jours après ce jour-là, y compris ce jour-là, donc (t2) {d5} se lirait "du lundi au vendredi" (vendredi est le 5ème jour après lundi, y compris le lundi)

Le problème ici est que je ne peux pas penser à un moyen de déterminer quel jour d -value représente en fonction de la valeur t. Si d serait une valeur fixe, il serait facile, mais d pourrait être quelque chose de 1 à 7.

Je le code suivant:

string dayFromName; 
StringBuilder stringBuilder = new StringBuilder(); 

foreach (string s in TimeDomain) 
{    
    var indexOfFirstBraceDayFrom = s.IndexOf('t') + 1; 
    var indexOfLastBraceDayFrom = s.IndexOf(')'); 
    var dayFromTemp = s.Substring(indexOfFirstBraceDayFrom, indexOfLastBraceDayFrom - indexOfFirstBraceDayFrom).Split(' '); 
    var dayFrom = dayFromTemp[0]; 

    var indexOfFirstBraceDayTo = s.IndexOf('d') + 1; 
    var indexOfLastBraceDayTo = s.IndexOf('}'); 
    var dayToTemp = s.Substring(indexOfFirstBraceDayTo, indexOfLastBraceDayTo - indexOfFirstBraceDayTo).Split(' '); 
    var dayTo = dayToTemp[0]; 

    if (dayFrom == "1") 
     dayFromName = "Sunday"; 
    if (dayFrom == "2") 
     dayFromName = "Monday"; 
    if (dayFrom == "3") 
     dayFromName = "Tuesday"; 
    if (dayFrom == "4") 
     dayFromName = "Wednesday"; 
    if (dayFrom == "5") 
     dayFromName = "Thursday"; 
    if (dayFrom == "6") 
     dayFromName = "Friday"; 
    if (dayFrom == "7") 
     dayFromName = "Saturday"; 

    stringBuilder.Append(dayFromName + "to"); 
} 

Cependant, je ne suis pas sûr de savoir comment définir le jour après "to" basé sur la valeur de D en référence à T. Avez-vous des suggestions?

+1

Vous pouvez utiliser quelque chose comme '(t + d - 1)% 7' –

Répondre

3

Je ne vois pas le problème. Une fois que vous avez calculé le jour à partir de la valeur d, vous pouvez déterminer le jour «à» de cette valeur. Si vous ajoutez la valeur « d » (en tenant compte de la inclusivité puis effectuez modulo arithmétique sur le résultat que vous pouvez obtenir le numéro du jour:

int toDay = (tValue + dValue - 1) % 7; 

faire alors même si/instruction switch (factoriser votre code)

Vous aurez besoin d'analyser vos valeurs "t" et "d" en entiers, mais ayant obtenu comme un entier, vous serez en mesure de convertir le jour en DayOfWeek enumeration - mais vous devrez compenser votre nombre à la valeur attendue par Microsoft

+0

Cela m'a aidé parfaitement, merci! – KDE

3

Au lieu de créer un if-1-if-2-if-3 "si-arbre", créez une recherche ictionary:

var daylookup = new Dictionary<int, string>(); 
daylookup[1] = "Sunday"; 
daylookup[2] = "Monday"; 
... 
daylookup[7] = "Saturday"; 

maintenant, au lieu d'écrire beaucoup de FI, vous pouvez simplement demander le dictionnaire:

dayName = daylookup[ dayNumber ]; 

Cela a un bonus supplémentaire. Comme le nombre de jours est juste un nombre entier, vous pouvez ajouter, soustraire, etc et rien ne change:

dayName = daylookup[ dayNumber + 1 ]; // the NEXT day 
//or 
dayName = daylookup[ dayNumber + 2 ]; // the DAY AFTER NEXT 
//or 
dayName = daylookup[ dayNumber + N ]; // the Nth day forward 

qui est l'idée de base.

Cependant, les dictionnaires et les mathématiques ne sont pas aussi simples. Sauf si vous mettez plus, votre dictionnaire a seulement des entrées pour 1,2,3,4,5,6,7 et en essayant de lire une entrée à savoir 10 (jour 6 + 2) lèvera une exception: il n'y a pas d'entrée pour "10 ".

qui est facilement résoluble:

  • soit en ajoutant d'autres entrées au dictionnaire
  • ou en vérifiant si le jour + offset dépasse 7 et en soustrayant 7/14/21/..
  • ou en utilisant modulo % (non Day + OFFSET, mais (jour + offset)% 7)
+0

Pourquoi ne pas juste '(System.DayOfWeek) (numéro - 1)'? Tellement de code pour quelque chose intégré dans le cadre? –

+0

Première fois que j'ai lu sur Dictionnaire, merci! Sauve moi un tas de si-boucles! – KDE

+0

@cFrozenDeath: parce que je sentais qu'il ne connaissait pas cette classe et pensait qu'il bénéficierait d'en apprendre davantage à ce sujet. – quetzalcoatl

1

Vous pouvez simplement utiliser System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.DayNames avec la seule différence que l'indice commence à 0. La requête ci-dessous dimanche retour en supposant que votre culture actuelle est l'anglais:

Console.WriteLine(CultureInfo.CurrentCulture.DateTimeFormat.DayNames[0]) 

Vous pouvez simplement faire ceci:

int dayNumber = int.Parse(dayFrom) - 1; 
dayFromName = CultureInfo.CurrentCulture.DateTimeFormat.DayNames[dayNumber]; 

Ou encore plus courte et la culture indépendante comme l'a souligné @cFrozenDeath:

var dayFromName2 = (System.DayOfWeek)dayNumber; 
+1

Pourquoi pas juste '(System.DayOfWeek) 0'? –

+0

Mise à jour de ma réponse pour inclure votre suggestion. – Jaco

+0

Terminez en utilisant votre première suggestion avec la référence CurrentCulture pour vous assurer que les jours ont été renvoyés dans la culture locale. Merci! – KDE

0

Réutiliser votre code il ressemblera:

string dayFromName; 
StringBuilder stringBuilder = new StringBuilder(); 

foreach (string s in TimeDomain) 
     { 
     var dayTomName = string.Empty; 
     var dayFromName = string.Empty; 

     var indexOfFirstBraceDayFrom = s.IndexOf('t') + 1; 
     var indexOfLastBraceDayFrom = s.IndexOf(')'); 
     var dayFromTemp = s.Substring(indexOfFirstBraceDayFrom, indexOfLastBraceDayFrom - indexOfFirstBraceDayFrom).Split(' '); 
     var dayFrom = dayFromTemp[0]; 

     var indexOfFirstBraceDayTo = s.IndexOf('d') + 1; 
     var indexOfLastBraceDayTo = s.IndexOf('}'); 
     var dayToTemp = s.Substring(indexOfFirstBraceDayTo, indexOfLastBraceDayTo - indexOfFirstBraceDayTo).Split(' '); 
     var dayTo = dayToTemp[0]; 

     dayToName = ((System.DayOfWeek)((int.Parse(dayFrom) + int.Parse(dayTo) - 2) % 7)).ToString(); 
     dayFromName = ((System.DayOfWeek)(int.Parse(dayFrom) - 1)).ToString(); 
} 
+0

Pourriez-vous développer ce qui précède avec une notation System.DayOfWeek dans System.Globalization.CultureInfo ("nl-NL")? – KDE

+0

System.DayOfWeek est juste enum et les valeurs sont indépendantes de la culture actuelle. Si vous voulez faire lundi le premier jour de la semaine au lieu du dimanche, vous devez décaler les index de +1 et les envelopper (..)% 7 pour vous assurer de ne pas avoir de débordement. – serhiyb