Meest efficiënte manier om Object Type Test

stemmen
17

Ik heb waarden opgeslagen als strings in een DataTablewaarin elke waarde een echt kan vormen int, doubleof string(ze allemaal omgezet in tekenreeksen tijdens een invoerproces uit een externe gegevensbron). Ik moet om te testen en te zien wat voor soort elke waarde werkelijk is.

Wat is efficiënter voor de toepassing (of is er geen praktisch verschil)?

  1. Probeer om te zetten naar int(en daarna double). Als conversie werken, het rendement true. Als er een uitzondering wordt gegooid terug false.
  2. Reguliere expressies ontworpen om het patroon van een match intofdouble
  3. Enkele andere methode?
De vraag is gesteld op 05/08/2008 om 08:49
bron van user
In andere talen...                            


5 antwoorden

stemmen
9

Zou double.TryParse gebruiken, heeft het prestatievoordelen.

antwoordde op 05/08/2008 om 08:54
bron van user

stemmen
6

Ik zou zeggen, doe niet zo veel over dergelijke micro prestaties zorgen. Het is veel beter om gewoon iets om te werken, en maak het dan zo duidelijk en beknopt en gemakkelijk mogelijk te lezen. Het ergste wat je kunt doen is offeren leesbaarheid voor een onbeduidend bedrag van de prestaties.

Op het einde, de beste manier om te gaan met problemen met de prestaties is om ze te bewaren voor als je gegevens die aangeeft dat er een daadwerkelijke prestaties probleem hebt ... anders krijg je een hoop tijd micro-optimalisatie door te brengen en hogere onderhoudskosten voor het daadwerkelijk veroorzaken later.

Als je merkt dat dit parsing situatie is echt de bottleneck in uw toepassing, dan is het tijd om te proberen erachter te komen wat de snelste manier om het oplossen van het probleem is. Ik denk dat Jeff (en vele anderen) hebben geblogd over dit soort dingen veel.

antwoordde op 05/08/2008 om 09:04
bron van user

stemmen
5

Het probleem u hebt is dat er situaties waarin het antwoord zou kunnen zijn alle drie de typen zou kunnen zijn.

3 kan een int, tweepersoons- of een string te zijn!

Het hangt af van wat je probeert te doen en hoe belangrijk het is dat ze een bepaald type. Het is misschien het beste alleen maar om hen te laten zoals ze zijn zo lang als je kunt of, als alternatief, sommige met een methode om een ​​ieder te markeren (als je de controle over de bron van de oorspronkelijke tekenreeks).

antwoordde op 23/09/2008 om 22:38
bron van user

stemmen
5

Je zult verschillende resultaten voor de verschillende methoden te krijgen, afhankelijk van of je compileren met optimalisaties op. Je eigenlijk een paar opties:

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 )

U kunt gemakkelijk het opzetten van een console app die elk van deze 10.000 keer probeert en keert duur voor elke (proef gesteld wanneer o is een int en wanneer het is iets anders).

De try-catchmethode is de snelste wanneer het object houdt wel een int en veruit de langzaamste als deze nog niet (zelfs langzamer dan GetType). int.TryParseis vrij snel als je een string, maar als je een onbekend object het is trager.

Interessant met Net 3.5 en optimalisaties zette de o is intcontrole neemt gelijktijdig try-catchals o eigenlijk een int. o is intis slechts iets langzamer als o eigenlijk is iets anders.

Hinderlijk FxCop zal overgeven waarschuwingen als je zoiets als:

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

Maar ik denk dat het een bug in FxCop - het niet weet int is een waarde type en adviseert u om te gebruiken o as intin plaats daarvan.

Als uw inbreng is altijd een string int.TryParseis het beste, anders wordt de isoperator is snelste.

Als je een string zou ik kijken of je moet weten dat het een int, in plaats van een dubbele. Als int.TryParsepasses dan zo zal double.TryParsedus je kon de helft van het aantal controles - terug een tweepersoonsbed of string en de vloer van de verdubbelt wanneer u verwacht een int.

antwoordde op 10/08/2008 om 18:43
bron van user

stemmen
3

Ik zou persoonlijk gebruik int.tryparse, dan double.tryparse. Prestaties op deze methoden is vrij snel. Beiden terug een Booleaanse. Als beide mislukken dan heb je een string, per hoe u uw gegevens gedefinieerd.

antwoordde op 05/08/2008 om 09:02
bron van user

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