Gå til innhold

Finne ut om string inneholder tall tar veldig lang tid


Anbefalte innlegg

Jeg har en utfordring i C#. Jeg har løsningen men problemet er at funksjonen bruker veldig lang tid på å utføre seg.

Jeg har altså en lag String tabell med mange forskjellig ord. Et ord per index.

Funksjonen min sjekker hvert ord i hver index og ser om det finnes et tall i strengen. Her er 2 funksjoner som gjør jobben.

 

 

bool hasDigit(String s)

{

int chars = s.Length;

 

CharEnumerator charenum = s.GetEnumerator();

charenum.Reset();

while (charenum.MoveNext())

{

char c = charenum.Current;

if (isDigit(c.ToString()))

return true;

 

}

return false;

}

 

 

 

bool isDigit(String s)

{

try

{

int result = int.Parse(s);

}

catch

{

return false;

}

return true;

}

 

 

 

 

 

 

Dette fungerer med riktige resultater men som sagt problemet er at det kan ta opp til 1 minutt å gå gjennom en tabell med 300 ord i. Er det noen som har forslag til hvordan dette kan gjøres på en annen måte?

 

Takk på forhånd

 

 

EDIT: Dette er C# sharp kode. Kanskje bør flyttes til C# seksjonen?

Endret av evgeny
Lenke til kommentar
Videoannonse
Annonse

Jeg har klart å løse problemet på en annen måte ved å bruke

 

if(string.Contains("1") || string.Contains("2") OSV

på den måten går det fort men det blr så stygt med hele 10 sånne tester på hvert tall.

Lurer veldig på hvorfor den første metoden med de 2 funskjonene har så dårlig ytelse.

Lenke til kommentar

Her var det mye rart og koden din er veldig lite C#'sk.

 

bool hasDigit(String s)

Det kan være lurt å følge de konvensjoner for store og små bokstaver som er vanlig i språket. I C# er det vanlig med stor forbokstav i metoder og properties. Og bruk string med liten s :) Bare et tips som gjør at koden din ser mer ut som annen C#-kode.

 

{

int chars = s.Length;

 

CharEnumerator charenum = s.GetEnumerator();

charenum.Reset();

while (charenum.MoveNext())

{

char c = charenum.Current;

if (isDigit(c.ToString()))

return true;

 

}

return false;

}

Dette var da en særdeles tungvinn måte å iterere over en string på? Hva er galt med

 

foreach (char c in s)
{
// ...
}

 

Litt enklere å lese spør du meg...

 

bool isDigit(String s)

{

try

{

int result = int.Parse(s);

}

catch

{

return false;

}

return true;

}

Her har du synderen din. Først og fremst fordi du bruker Parse og ikke TryParse. Det er dyrt å kaste exceptions, man må ta et bilde av hele stacken for å få med stacktracen. Det koster. For det andre; det finnes allerede en Char.IsDigit() -- bruk den i stedet.

 

Jeg kjeda meg og lagde en minitest som kjørte koden din og min (som var helt lik slik jorn79 postet) 10 ganger på samme input og tok tiden. Inputen var en tekstfil med 380 linjer som ble lest inn før tidtakingen startet, der ca halvparten av linjene inneholdt tall.

 

Første linje er tiden for koden din, andre linje viser koden din der det brukes TryParse og ikke Parse og siste linje er koden min.

 

time=00:03:15.2343750
time=00:00:00.0156250
time=00:00:00.0156250

 

Som du ser, din brukte 3 minutter på å gjøre dette 10 ganger. Uten exception-kasting hele tiden gikk det en del fortere og det gikk like fort som den mest rett-fram versjonen jorn kom med. Nøyaktig like fort faktisk.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...