Vă mulțumim pentru susținere

Cel mai eficient mod de a testa tipul de obiect

Am valori stocate ca șiruri de caractere într-un DataTable unde fiecare valoare ar putea reprezenta într-adevăr un cod int , double (toate au fost convertite în șiruri de caractere în timpul unui proces de import dintr-o sursă externă de date). Trebuie să testez și să văd ce tip de valoare este în realitate.

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

  1. Try to convert to int (and then double). If conversion works, the return true. If an exception is thrown, return false.
  2. Regular expressions designed to match the pattern of an int or double
  3. Some other method?
0
adăugat editat

5 răspunsuri

Aș spune, nu vă faceți griji atât de mult despre astfel de performanțe micro. Este mult mai bine să obțineți ceva pentru a lucra și apoi să o faceți cât mai clară și mai concisă și mai ușor de citit. Cel mai rău lucru pe care îl puteți face este sacrificarea lizibilității pentru o cantitate nesemnificativă de performanță.

În cele din urmă, cel mai bun mod de a rezolva problemele de performanță este să le salvați atunci când aveți date care indică o problemă reală de performanță ... în caz contrar veți petrece foarte mult timp optimizarea micro și, de fapt, mai târziu.

Dacă găsiți că această situație de analiză este într-adevăr piedica în aplicația dvs., atunci este timpul să încercați să aflați ce este cel mai rapid mod de a rezolva problema. Cred că Jeff (și mulți alții) au blogat foarte mult despre acest gen de lucruri.

0
adăugat

Aș folosi personal int.tryparse, apoi double.tryparse. Performanța pe aceste metode este destul de rapidă. Amândoi returnează un boolean. Dacă ambele eșuează, atunci aveți un șir, conform modului în care ați definit datele.

0
adăugat

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

0
adăugat

Veți obține rezultate diferite pentru diferitele metode în funcție de compilarea optimizărilor. În principiu aveți 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 configura cu ușurință o aplicație de consolă care încearcă fiecare dintre aceste 10000 de ori și returnează durate pentru fiecare (test când o este un int și când este altceva).

Metoda try-catch este cea mai rapidă dacă obiectul deține un int și de departe cel mai lent dacă nu (chiar mai lent decât GetType ). int.TryParse este destul de rapidă dacă aveți un șir, dar dacă aveți un obiect necunoscut, este mai lent.

Interesant este că, dacă .Net 3.5 și optimizările sunt activate, comanda o este int are același timp cu try-catch atunci când o este de fapt int. o este int este doar puțin mai lent dacă o este de fapt altceva.

FxCop deranjant va arunca avertismente daca faci ceva de genul:

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

Dar cred că este un bug în FxCop - nu știe int este un tip de valoare și vă recomandă să utilizați în schimb o ca int .

Dacă intrarea dvs. este întotdeauna un șir int.TryParse este cel mai bun, altfel operatorul este este cel mai rapid.

Pe măsură ce aveți un șir, m-aș uita dacă trebuie să știți că este un int, mai degrabă decât un dublu. Daca codul int.TryParse trece atunci atunci double.TryParse astfel incat sa puteti face jumatate din numarul de cecuri - returnati dublu sau string si dublu dublu cand astepti un int.

0
adăugat

Problema pe care o 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!

Depinde de ceea ce încerci să faci și cât de important este faptul că ele sunt un tip particular. Ar fi mai bine să le lăsați cât mai mult timp posibil sau, alternativ, să faceți o metodă de marcare a fiecăruia (dacă aveți controlul asupra sursei șirului original).

0
adăugat
Scopul final a fost să încercăm să determinăm tipul de date cel mai exclusiv pentru obiect. 3 ar fi un int. 3.5 ar fi dublu. "Trei" ar fi un șir. Am pus în cele din urmă o funcție care a încercat o grămadă de obiect.TryParse apeluri până când ar putea determina ce a fost cel mai potrivit tip de date.
adăugat autor Yaakov Ellis