Entwickler-Ecke
Basistechnologien - Alle Tage zwischen einem Start- und Enddatum herausfinden?
Nally - Mi 19.11.08 20:01
Titel: Alle Tage zwischen einem Start- und Enddatum herausfinden?
Hallo,
ich habe 2 Daten. Nun möchte ich alle Daten die dazwischenliegen in ein Array einlesen.
Wie finde ich die Daten die dazwischen liegen heraus? Man müsste irgendwie durch das TimeSpan iterieren können, den aktuellen wert + 1 Tag, +2 tage usw. bis man das
Enddatum erreicht hat, jeweils immer mit if prüfen ob Datum + i for for schleife = enddatum ist. Gehts nicht irgendwie einfacher? :)
JüTho - Mi 19.11.08 20:08
Hallo und :welcome:
natürlich geht es einfacher. Zunächst empfehle ich, statt mit einem Array besser eine
List<DateTime> zu verwenden: Ein Array hat eine feste Größe, während List<T> flexibler ist. (Bei dieser konkreten Aufgabe ist das nicht ganz so wesentlich wegen der nächsten Feststellung:)
Durch
TimeSpan.Days der Instanz, die durch die Differenz entsteht, kennst Du die Anzahl der Tage und kannst die Größe des Arrays oder der List<T> festlegen.
Für die Schleife kannst Du auch das Datum als Laufvariable verwenden:
C#-Quelltext
1: 2: 3:
| for(DateTime dt = Startdatum; dt <= Enddatum; dt = dt.AddDays(1)) { theList.Add(dt); } |
Gruß Jürgen
Nally - Mi 19.11.08 20:16
ja ich schäme mich ja hihi denn ich habs mittlerweile via google rausgefunden, das problem war nur wie immer die richtigen Stichworte. Die meisten kamen auf deine Lösung wobei dein Code die kürzeste Schreibweise ist, von daher VIELEN Dank!
Nally - Mi 19.11.08 20:32
au jetzt hab ich doch ein Problem mit deiner Lösung:
2 Klassenvariablen:
private static DateTime tempSchoolYearStart;
private static DateTime tempSchoolYearEnd;
private List<DateTime> schoolyearList;
deine forschleife abgeändert von mir:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| private void ReadAllDays() { for (tempSchoolYearStart; tempSchoolYearStart <= tempSchoolYearEnd; tempSchoolYearStart.AddDays(1)) { schoolyearList.Add(tempSchoolYearStart); } } |
nun bekomme ich 1 Fehler: die Werte-Initialisierung der For-Schleife wie mache ich das mit dem Datum?
Moderiert von
Christian S.: C#-Tags hinzugefügt
also jetzt hätte ich noch 2 Lösungen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| private void ReadAllDays() { DateTime tmpDate = tempSchoolYearStart; do { schoolyearList.Add(tmpDate); tmpDate = tmpDate.AddDays(1); } while (tmpDate <= tempSchoolYearEnd); } |
oder eigentlicher aktueller C#2.0:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| IEnumerable<DateTime> GetDateRange(DateTime StartingDate, DateTime EndingDate) { while (StartingDate <= EndingDate) { yield return StartingDate; StartingDate = StartingDate.AddDays(1); } } |
was sollte man nun benutzen?
Kha - Mi 19.11.08 22:19
Nally hat folgendes geschrieben : |
nun bekomme ich 1 Fehler: die Werte-Initialisierung der For-Schleife wie mache ich das mit dem Datum? |
Da du den Wert deines Start-Feldes wahrscheinlich unverändert lassen willst, musst du eine lokale Schleifenvariable (wie in Jürgens Code) einführen.
Nally hat folgendes geschrieben : |
oder eigentlicher aktueller C#2.0: |
Wenn du es ganz aktuell haben willst:
C#-Quelltext
1: 2: 3: 4:
| public static IEnumerable<DateTime> GetDaysBetween(DateTime from, DateTime to) { return Enumerable.Range(0, (to-from).Days + 1).Select(i => from.AddDays(i)); } |
Könnte auch Fließkomma-Probleme umgehen, die bei den AddDays(1)-Lösungen eventuell auftreten.
Nally - Do 20.11.08 12:37
habs so gemacht: deine Linq + Lambda Lösung ist mir zu unleserlich ;-)
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| private List<DateTime> ReadAllDays1() { for (DateTime tmpDate = tempSchoolYearStart; tempSchoolYearStart <= tempSchoolYearEnd; tempSchoolYearStart.AddDays(1)) { schoolyearList.Add(tempSchoolYearStart); } return schoolyearList; } |
JüTho - Do 20.11.08 13:04
Hallo Nally,
zu LINQ + Lambda kann ich nichts sagen; deshalb gefällt mir Deine Lösung eigentlich besser. Sie enthält aber einige Fehler und Problemstellen:
schoolyearList ist doch außerhalb der Methode deklariert. Also bringt es nichts, diese als return-Wert zurückzugeben. Entweder sie wird innerhalb der Methode als temp-Variable deklariert, mit new erzeugt und dann zurückgegeben; oder die Methode wird als void deklariert unter Wegfall des return-Befehls.
Was passiert, wenn die Methode mehrfach aufgerufen wird? Dann ist doch vermutlich der bisherige Inhalt von schoolyearList zu löschen.
In der for-Schleife deklarierst Du die Schleifenvariable tmpDate, aber Du benutzt diese überhaupt nicht. Die Schlussbedingung ist konstant; die Änderungsanweisung ist falsch (AddDays ist nicht void, sondern liefert einen neuen DateTime-Wert zurück).
Der Liste fügst Du immer den Startwert hinzu.
Gruß Jürgen
Nally - Fr 21.11.08 18:04
sorry hab dir alten code gegeben, der hier war ok:
da wird die Liste innerhalb erzeugt
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| private void ReadAllDays() { DateTime tmpDate = tempSchoolYearStart; schoolyearList = new List<DateTime>(); do { schoolyearList.Add(tmpDate); tmpDate = tmpDate.AddDays(1); Console.Out.WriteLine(tmpDate); } while (tmpDate <= tempSchoolYearEnd); } |
Moderiert von
Christian S.: C#-Tags hinzugefügt
JüTho - Fr 21.11.08 18:31
Ah ja, das liest sich besser. Hieran sieht man gut, dass for-Schleifen und do-while-Schleifen oft das gleiche machen.
Falsch: Inhaltlich besser, aber Lesbarkeit katastrophal, weil die C#-Tags fehlen! Bitte nachtragen! Danke an Christian, ist erledigt.
Jürgen
Nally - Sa 22.11.08 19:05
ja sorry wegen den c# tags, wußte zuerst net genau wie das geht, da die forensoftware bzw. das editfeld nicht sehr gewohnt ist für mich. Gelobe Besserung ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!