evgeny Skrevet 31. januar 2008 Del Skrevet 31. januar 2008 (endret) 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 31. januar 2008 av evgeny Lenke til kommentar
evgeny Skrevet 31. januar 2008 Forfatter Del Skrevet 31. januar 2008 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
j000rn Skrevet 31. januar 2008 Del Skrevet 31. januar 2008 bool HasNumber(string stringenmin) { foreach(char ch in stringenmin) if( char.IsNumeric(ch) ) return true; return false; } Lenke til kommentar
steingrim Skrevet 31. januar 2008 Del Skrevet 31. januar 2008 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
evgeny Skrevet 1. februar 2008 Forfatter Del Skrevet 1. februar 2008 Wow helt utrolig. Takk for en fin benchmark der. Da bruker jeg foreach(char ch in stringenmin) Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå