J'ai le code suivant, qui simule une semaine début samedi puis divise la semaine en 2 parties, revenant mardi si la date donnée est samette, sinon cela retourne au vendredi, mais je pense que je suis en train de faire quelque chose mal, et que le code pourrait être simplifié, mais je ne peux pas comprendre comment.
private static DateTime SemiWeeklyEndDate(DateTime date)
{
if (((7 + (date.DayOfWeek - DayOfWeek.Saturday)) % 7) <= ((7 + (DayOfWeek.Tuesday - DayOfWeek.Saturday)) % 7))
return date.AddDays((((int)DayOfWeek.Tuesday - (int)date.DayOfWeek + 7) % 7));
return date.AddDays((((int)DayOfWeek.Friday - (int)date.DayOfWeek + 7) % 7));
}
3 Réponses :
Vous pouvez créer quelque chose un peu plus lisible en utilisant des fonctions locales:
private static DateTime SemiWeeklyEndDate(DateTime date)
{
int DaysBetween(DayOfWeek from, DayOfWeek to) => (to - from + 7) % 7;
int DaysToEndOfWeek(DayOfWeek from) => DaysBetween(from, DayOfWeek.Saturday);
var pastMidWeek = DaysToEndOfWeek(date.DayOfWeek) <= DaysToEndOfWeek(DayOfWeek.Tuesday);
var daysOffset =
pastMidWeek
? DaysBetween(DayOfWeek.Tuesday, date.DayOfWeek)
: DaysBetween(DayOfWeek.Friday, date.DayOfWeek);
return date.AddDays(daysOffset);
}
Droite, c'est évident ... je me demande s'il y a quelque chose dans la logique qui peut être simplifiée
Ensuite, @netmage Réponse sera parfaite pour vous.
J'ai mis à jour pour mieux transmettre la logique.
Vous pouvez simplifier le tout en calculant le décalage approprié pour chaque jour de la semaine à partir des valeurs DOW intégrées:
private static int[] DOWToOffsetMap = new[] { 3, 2, 1, 0, 2, 1, 0 };
private static DateTime SemiWeeklyEndDate2(DateTime date) => date.AddDays(DOWToOffsetMap[(int)date.DayOfWeek]);
Désolé mais cette fonction ne renvoie pas la bonne réponse. Est-ce que je manque quelque chose?
@ User2585 Lorsque j'utilise cette fonction par rapport à votre fonction, j'ai les mêmes résultats?
Tu as raison, bonne réponse, je ne sais pas pourquoi quelqu'un a voté
@ User2585 FYI, j'ai ajouté une version mappée de tableau si vous souhaitez échanger des stockages pour la performance.
C'est comme ça que j'aime faire ce type de problèmes
Si vous avez du code de travail, cela pourrait être un meilleur ajustement pour codereview .
Je suis un débutant ici, et j'aimerais avoir des commentaires, pourquoi cette question était fermée.
Je pense que la question est que "peut-il être simplifié?" Comme une question est subjective (il suffit de regarder les réponses variables). Si vous pouvez le transformer en une question objective, "pouvez-le être fait avec moins d'opérations modulo" vous seriez bon. Sinon, si c'est "hé, revoyez-le pour moi s'il vous plaît, commentaires Bienvenue", puis vous devriez poster ceci dans codereview .