Ich bin mir nicht einmal sicher, wie ich das machen soll, ohne eine schreckliche Lösung vom Typ Loop / Counter zu verwenden. Hier ist das Problem:
Ich habe zwei Daten, ein Startdatum und ein Enddatum, und in einem bestimmten Intervall muss ich etwas unternehmen. Zum Beispiel: Für jedes Datum zwischen dem 10.03.2009 an jedem dritten Tag bis zum 26.03.2009 muss ich einen Eintrag in einer Liste erstellen. Meine Eingaben wären also:
DateTime StartDate = "3/10/2009";
DateTime EndDate = "3/26/2009";
int DayInterval = 3;
und meine Ausgabe wäre eine Liste mit den folgenden Daten:
13.03.2009 16.03.2009 19.03.2009 22.03.2009 25.03.2009
Wie zum Teufel würde ich so etwas tun? Ich dachte darüber nach, eine for-Schleife zu verwenden, die zwischen jedem Tag im Bereich mit einem separaten Zähler wie folgt iteriert:
int count = 0;
for(int i = 0; i < n; i++)
{
count++;
if(count >= DayInterval)
{
//take action
count = 0;
}
}
Aber es scheint, als gäbe es einen besseren Weg?
Antworten:
Nun, Sie müssen sie auf die eine oder andere Weise durchlaufen. Ich bevorzuge es, eine Methode wie diese zu definieren:
Dann können Sie es so verwenden:
Auf diese Weise können Sie jeden zweiten Tag, jeden dritten Tag, nur Wochentage usw. treffen. Um beispielsweise jeden dritten Tag ab dem Startdatum zurückzukehren, können Sie
AddDays(3)
stattdessen einfach in der Schleife anrufenAddDays(1)
.quelle
Ich habe eine
Range
Klasse in MiscUtil, die Sie nützlich finden könnten. In Kombination mit den verschiedenen Erweiterungsmethoden können Sie Folgendes tun:(Vielleicht möchten Sie das Ende ausschließen oder nicht - ich dachte nur, ich würde es als Beispiel geben.)
Dies ist im Grunde eine fertig gerollte (und allgemeinere) Form der Lösung von mquander.
quelle
ExcludeEnd()
ist niedlich.Für Ihr Beispiel können Sie versuchen
quelle
Code von @mquander und @Yogurt The Wise, der in Erweiterungen verwendet wird:
quelle
EachDayTo
undEachMonthTo
? Ich glaube, ich habe hier etwas verpasst.quelle
1 Jahr später, möge es jemandem helfen,
Diese Version enthält ein Prädikat , um flexibler zu sein.
Verwendung
Täglich zu meinem Geburtstag
Monatlich zu meinem Geburtstag, Schritt 2 Monate
Jährlich zu meinem Geburtstag
Verwenden Sie
RangeFrom
stattdessenImplementierung
Extras
Sie könnten eine Ausnahme auslösen, wenn die
fromDate > toDate
, aber ich ziehe es vor, stattdessen einen leeren Bereich zurückzugeben[]
quelle
quelle
while
hinzugefügt wird.Je nach Problem können Sie dies versuchen ...
Vielen Dank......
quelle
quelle
Sie können stattdessen einen Iterator schreiben, mit dem Sie die normale 'for'-Schleifensyntax wie' ++ 'verwenden können. Ich habe eine ähnliche Frage gesucht und gefunden, die hier auf StackOverflow beantwortet wurde und Hinweise darauf gibt, wie DateTime iterierbar gemacht werden kann.
quelle
Sie können die
DateTime.AddDays()
Funktion verwenden, um IhreDayInterval
zu der hinzuzufügenStartDate
und zu überprüfen, ob sie kleiner als die istEndDate
.quelle
Sie müssen hier vorsichtig sein, um die Daten nicht zu verpassen, wenn in der Schleife eine bessere Lösung wäre.
Dies gibt Ihnen das erste Datum des Startdatums und verwendet es in der Schleife, bevor Sie es erhöhen. Es verarbeitet alle Daten einschließlich des letzten Datums des Enddatums, also <= Enddatum.
Die obige Antwort ist also die richtige.
quelle
Sie können dies verwenden.
quelle
Iterieren Sie alle 15 Minuten
quelle
@ Jacob-Sobus und @ Mquander und @ Joghurt nicht genau richtig .. Wenn ich am nächsten Tag brauche, warte ich meistens 00:00 Uhr
quelle
Hier sind meine 2 Cent im Jahr 2020.
quelle