Diskuze: Porovnání datumu ve Foreach cyklu - aplikace spadne

C# .NET .NET (C# a Visual Basic) Porovnání datumu ve Foreach cyklu - aplikace spadne American English version English version

Avatar
Matyáš Černohous (Matesak):

Zdravím, řeším problém ohledně foreach cyklu. Mám aplikaci pro WP 8.1 a ve foreach porovnávám 2 datumy. Když jsem si zkoušel dát breakpoint na porovnání, tak se datumy porovnaly, ale hned potom aplikace spadne. Nevíte kde by mohl být problém. Když tam to porovnání není, tak kód funfuje normálně. Díky :)

foreach (Tasks ta in obj)
           {

               string sPredmet = ta.Predmet;
               string sDatum = ta.Datum;
               string SPripom = ta.Pripomenuti;
               string sZbD = ta.ZbyvaDni;
               string sSdileno = ta.Sdileno;
               string sSpleneno = ta.Splneno;

               int results = DateTime.Compare(DateTime.Parse(ta.Datum.ToString()), DateTime.Parse(datum.ToString()));  - tady aplikace spadne i když se data porovnala

               if(results > 0)
               {
                   MissTasks.Add(new Tasks(sPredmet, sDatum, sSpleneno, sZbD, SPripom, sSdileno));
               }
               else
               {
                   myTasks.Add(new Tasks(sPredmet, sDatum, sSpleneno, sZbD, SPripom, sSdileno));
               }
           }
 
Odpovědět 1.2.2015 0:09
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Matyáš Černohous (Matesak)
Jan Vargovský:

Uvědomuješ si co vůbec děláš? Ty vezmeš datum, převedeš ho na string a pak si ho převedeš znova na datum. Nevím co dělá DateTime.Compare, ale to nemůžeš jednoduše napsat:

ta.Datum > datum

Popřípadě s tou Compare metodou:

DateTime.Compare(ta.Datum, datum);
 
Nahoru Odpovědět  +2 1.2.2015 0:39
Avatar
mc
Člen
Avatar
mc:

Rada1: rozděl si vyhodnocování řádek po řádku. Nejdřív naparsuj data, pak je předej k porovnání.
Rada2: Když chceš radu, hodil by se stack trace nebo aspoň informace o té vyjimce, která tam vyletěla.

 
Nahoru Odpovědět 1.2.2015 10:17
Avatar
Odpovídá na Jan Vargovský
Matyáš Černohous (Matesak):

Ano, uvědomuju. Jak jsi psal, že to mám zkusit jednoduše porovnat, tak to bylo to první co jsem udělal, ale dopadá to stejně. Nejhorší je, že to nevyhodí žádnou vyjímku, ale přímo Global error, takže se nemám čeho chytit...

 
Nahoru Odpovědět 1.2.2015 14:41
Avatar
Odpovídá na Matyáš Černohous (Matesak)
sadlomaslox25:

nefunguje to protoze to spadne na parse (na cem jinem by to taky spadlo ze :))

pada to tam z duvodu ze tam cpes datum ve spatnem formatu. zalezi na jakem vlakne poustit tu metodu parse protoze ta si bere z aktualniho vlakna Culturu a zkousi to parsovat vuci ni (takze nejspis se pokousis prevest cesky format datumu pomoci anglicke varianty DateTime.Parse).

alternativne to jeste muze spadnout na nullExceptionu to protoze nektery ze stringu je null.

rada: v programu string reprezentuj vzdy strukturou DateTime

 
Nahoru Odpovědět 1.2.2015 15:14
Avatar
Odpovídá na Matyáš Černohous (Matesak)
Michal Štěpánek:

Nezkusil sis vypsat, jaké hodnoty se ti to vlastně ve skutečnosti porovnávají?

Nahoru Odpovědět 1.2.2015 15:21
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Jan Vargovský
Redaktor
Avatar
Jan Vargovský:

Jo ty máš to datum ve stringu, tak jsme doma... Btw, celkem si mě pobavil :D ještě jsem neviděl volat na stringu ToString :D

Editováno 1.2.2015 15:28
 
Nahoru Odpovědět 1.2.2015 15:27
Avatar
Odpovídá na Jan Vargovský
Petr Čech (czubehead):
foreach (Tasks ta in obj)
            {
                string sPredmet = ta.Predmet;
                string sDatum = ta.Datum;
                string SPripom = ta.Pripomenuti;
                string sZbD = ta.ZbyvaDni;
                string sSdileno = ta.Sdileno;
                string sSpleneno = ta.Splneno;

                int results = DateTime.Compare(ta.Datum, datum);//předpokládám, že ta.Datum je DateTime
                if(results > 0)
                {
                    MissTasks.Add(new Tasks(sPredmet, sDatum, sSpleneno, sZbD, SPripom, sSdileno));
                }
                else
                {
                    myTasks.Add(new Tasks(sPredmet, sDatum, sSpleneno, sZbD, SPripom, sSdileno));
                }
            }

možná ti pomůže https://msdn.microsoft.com/…time.compare(v=vs.110).aspx
nevíme, co je v "datum" Jestli je to DateTime, bude to fungovat. jestli ne, tak si ho tam ulož, ale jinak než DateTime.Parse(), nebo používej cultures
jinak Jan Vargovský myslím, že se to nedá porovnávat jen pomocí <, >, ... Už jsem na tom jednou pohořel. Nebo to prostě neumím používat, no :D

Editováno 1.2.2015 16:51
Nahoru Odpovědět 1.2.2015 16:49
Why so serious? -Joker
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Petr Čech (czubehead)
Jan Vargovský:
public static TimeSpan operator -(DateTime d1, DateTime d2);
public static DateTime operator -(DateTime d, TimeSpan t);
public static bool operator !=(DateTime d1, DateTime d2);
public static DateTime operator +(DateTime d, TimeSpan t);
public static bool operator <(DateTime t1, DateTime t2);
public static bool operator <=(DateTime t1, DateTime t2);
public static bool operator ==(DateTime d1, DateTime d2);
public static bool operator >(DateTime t1, DateTime t2);
public static bool operator >=(DateTime t1, DateTime t2);

Spíše to druhé :)

 
Nahoru Odpovědět  +1 1.2.2015 16:52
Avatar
Odpovídá na sadlomaslox25
Matyáš Černohous (Matesak):

Tak to padá přesně kvůli tomu jak jsi říkal. Moje datum je ve formátu dd/mm/yyyy a snaží se to parsovat do DateTime EN dd/mm/yyyy hh:mm:ss AM. Nevíte jak bych mohl udělat, aby to šlo přímo do českého, nebo jen do formátu **dd/mm/yy **?

Jan Vargovský mám datum ve stringu, bohužel ho jako DateTime nedostanu :/

Editováno 1.2.2015 19:51
 
Nahoru Odpovědět 1.2.2015 19:51
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Matyáš Černohous (Matesak)
Jan Vargovský:
CultureInfo culture = new CultureInfo("cs-CZ");
DateTime date = DateTime.Parse("1/2/2015", culture);
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 1.2.2015 20:01
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.