Cel mai modalitate eficientă de a testa tipul de obiect

voturi
17

Am valori stocate ca siruri de caractere într - o în DataTablecazul în care fiecare valoare ar putea reprezenta într - adevăr o int, doublesau string(toate acestea au fost convertite în șiruri în timpul unui proces de import dintr - o sursă externă de date). Am nevoie pentru a testa și de a vedea ce tip de fiecare valoare este într - adevăr.

Ce este mai eficient pentru aplicația (sau nu există nici o diferență practică)?

  1. Încercați să se convertească la int(și apoi double). În cazul în care lucrări de conversie, întoarcerea în țară true. În cazul în care o excepție este aruncată, întoarce false.
  2. Expresiile regulate concepute pentru a se potrivi cu modelul unui intsaudouble
  3. Altă metodă?
Întrebat 05/08/2008 la 08:49
sursa de către utilizator
În alte limbi...                            


5 răspunsuri

voturi
9

Ar folosi double.TryParse, are beneficii de performanță.

Publicat 05/08/2008 la 08:54
sursa de către utilizator

voturi
6

Aș spune, nu vă faceți griji atât de mult despre o astfel de performanță micro. Este mult mai bine pentru a obține doar ceva la locul de muncă, și apoi să-l cât mai clar și concis și ușor de citit posibil. Cel mai rau lucru pe care il poti face este lizibilitate sacrificiu pentru o cantitate nesemnificativă de performanță.

În cele din urmă, cel mai bun mod de a face cu probleme de performanță este de a le salva pentru atunci când aveți date care indică faptul că există o problemă reală de performanță ... altfel veți petrece o mulțime de timp de micro-optimizare și poate cauza de fapt, costuri mai mari de întreținere pentru mai târziu.

Dacă găsiți această situație parsarea este într-adevăr gâtuire în aplicația dvs., apoi este timpul pentru a încerca să dau seama ce cel mai rapid mod de a rezolva problema este. Cred că Jeff (și mulți alții) au blogged despre acest tip de lucru foarte mult.

Publicat 05/08/2008 la 09:04
sursa de către utilizator

voturi
5

Problema aveți este că ar putea exista situații în care răspunsul ar putea fi toate cele trei tipuri.

3 ar putea fi un int, un dublu sau un șir de caractere!

Aceasta depinde de ceea ce încercați să faceți și cât de important este faptul că acestea sunt un anumit tip. S-ar putea să fie cel mai bine doar pentru a le lăsa așa cum sunt acestea, atâta timp cât poți sau, în mod alternativ, unele cu o metodă pentru a marca fiecare (dacă aveți un control al sursei de șirul original).

Publicat 23/09/2008 la 22:38
sursa de către utilizator

voturi
5

Veți obține rezultate diferite pentru diferite metode, în funcție de faptul dacă compilați cu optimizările pe. Tu, practic, câteva opțiuni:

object o;

//checking with is
o is int

//check type
o.GetType() != typeof( int )

//cast and catch exception
try{ int j = (int) o; } 
catch {}

//use the tryparse
int.TryParse( Convert.ToString( o ), out j )

Puteți seta cu ușurință o aplicație consolă, care încearcă fiecare dintre aceste 10.000 de ori și returnează durate pentru fiecare (test atunci când o este un int și când este altceva).

try-catchMetoda este cel mai rapid în cazul în care obiectul deține o int, si de departe cel mai lent în cazul în care nu (chiar mai lent decât GetType). int.TryParseeste destul de rapid , dacă aveți un șir de caractere, dar dacă aveți un obiect necunoscut este mai lent.

Interesant, cu .Net 3.5 si optimizări pornit pe o is intcec ia în același timp , ca și try-catchatunci când o de fapt este un int. o is inteste doar puțin mai lent în cazul în care de fapt este o altceva.

Enervant FxCop va arunca în sus avertismente dacă faci ceva de genul:

if( o is int )
    int j = (int) o;

Dar cred că e un bug în FxCop - ea nu știe int este un tip de valoare și recomandă să utilizați în o as intschimb.

În cazul în care dvs. de intrare este întotdeauna un șir de caractere int.TryParseeste cel mai bine, în caz contrar, isoperatorul este mai rapid.

Ca ai un șir de caractere aș uita la dacă trebuie să știți că este un int, mai degrabă decât un dublu. Dacă int.TryParsetrece atunci așa va double.TryParseastfel încât ai putea jumătate din numărul de controale - returnează fie dublu sau șir de caractere și podea dubleaza cand te astepti un int.

Publicat 10/08/2008 la 18:43
sursa de către utilizator

voturi
3

Mi-ar folosi personal int.tryparse, apoi double.tryparse. Performanță cu privire la aceste metode este destul de rapid. Ambele returna un boolean. Dacă ambele eșuează, atunci aveți un șir de caractere, pe modul în care sunt definite datele.

Publicat 05/08/2008 la 09:02
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more