Heute mal ein kurzer Eintrag, der die Frage “Wie kann ich eine Liste von aufeinanderfolgenden Jahreszahlen einfach erzeugen?” beantworten soll. Out-of-the-box wird das Ganze nicht unterstützt, deshalb schreiben wir uns einfach eine kleine Hilfsmethode, die wir ja in eine Bibliothek oder dergleichen auslagern können:
public static List<DateTime> FindYearsBetween(DateTime start, DateTime end, bool includeStart, bool includeEnd)
{
if (start == null) throw new ArgumentNullException("Start-DateTime is null.");
if (end == null) throw new ArgumentNullException("End-DateTime is null.");
// Zuerst überprüfen wir, ob das Start-Datum gültig ist ...
if (start == System.DateTime.MaxValue || start == System.DateTime.MinValue)
throw new ArgumentOutOfRangeException("Start-DateTime cannot be MaxValue or MinValue.");
// ... und das gleiche für das End-Datum.
if (end == System.DateTime.MaxValue || end == System.DateTime.MinValue)
throw new ArgumentOutOfRangeException("End-DateTime cannot be MaxValue or MinValue.");
// Das Start-Datum muss vor dem End-Datum liegen.
if (start.CompareTo(end) >= 0)
throw new ArgumentOutOfRangeException("End-DateTime must be later than Start-DateTime.");
// Soll das Anfangsjahr nicht in die Ergebnismenge inkludiert werden, dann zählen
// wir zu dem Anfangsjahr einfach ein Jahr dazu, somit beginnen wir beim Folgejahr.
if (!includeStart) start = start.AddYears(1);
// Soll das Endjahr nicht in die Ergebnismenge inkludiert werden, dann holen wir
// uns das Vorgängerjahr. Somit beenden wir die Suche schon beim Vorgängerjahr.
if (!includeEnd) end = end.AddYears(-1);
List<System.DateTime> range = new List<System.DateTime>();
// Jetzt fürgen wir solange neue Datumswerte hinzu, bis das
// Anfangsjahr gleich dem Endjahr ist.
while (start <= end)
{
range.Add(start);
start = start.AddYears(1);
}
return range;
}
Der Code inkl. Kommentare ist großteils selbsterklärend. Wichtig ist, die übergebenen Datumswerte auf Gültigkeit zu prüfen – zB muss das Enddatum nach dem Startdatum liegen. Die beiden boolschen Parameter geben an, ob das Startdatum (also das Jahr) in die Ergebnismenge inkludiert werden soll — das gleiche gilt für das Enddatum.
Demoprojekt inklusive Unit.Tests (nunit) gibts wie immer als Download: http://downloads.juergenoberngruber.at/blog/DateTimeList.zip
In diesem Sinne.
