Autor Beitrag
Nally
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Mi 19.11.08 20:01 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
2:
3:
for(DateTime dt = Startdatum; dt <= Enddatum; dt = dt.AddDays(1)) {
   theList.Add(dt);
}


Gruß Jürgen
Nally Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: 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:

ausblenden 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 user profile iconChristian S.: C#-Tags hinzugefügt

also jetzt hätte ich noch 2 Lösungen:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 19.11.08 22:19 
user profile iconNally hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconNally hat folgendes geschrieben Zum zitierten Posting springen:
oder eigentlicher aktueller C#2.0:
Wenn du es ganz aktuell haben willst:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Do 20.11.08 12:37 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconNally hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconNally hat folgendes geschrieben Zum zitierten Posting springen:
oder eigentlicher aktueller C#2.0:
Wenn du es ganz aktuell haben willst:
ausblenden 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.


habs so gemacht: deine Linq + Lambda Lösung ist mir zu unleserlich ;-)

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Fr 21.11.08 18:04 
sorry hab dir alten code gegeben, der hier war ok:

da wird die Liste innerhalb erzeugt

ausblenden 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 user profile iconChristian S.: C#-Tags hinzugefügt
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: 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 ;-)