Vra

Ek het waardes gestoor as snare in 'n DataTable waar elke waarde werklik 'n int, double, of string kan verteenwoordig (hulle is almal tot bekering te snare tydens 'n invoer proses van 'n eksterne data bron). Ek nodig het om te toets en sien watter soort elke waarde werklik is.

Wat is meer doeltreffend vir die aansoek (of is daar geen praktiese verskil)?

  1. Probeer om te skakel na int (en dan double). As omskakeling werke, die terugkeer true. As 'n uitsondering is gegooi, terugkeer false.
  2. Gereelde uitdrukkings wat ontwerp is om die patroon van 'n int of double pas
  3. 'n ander metode?
Was dit nuttig?

Oplossing

Sou double.TryParse gebruik, dit het prestasie voordele.

Ander wenke

Ek sou sê, nie soseer oor sulke mikro prestasie bekommerd wees nie. Dit is baie beter om net te kry iets om te werk, en dan maak dit so duidelik en bondig en maklik as moontlik te lees. Die ergste ding wat jy kan doen is offer leesbaarheid vir 'n onbeduidende bedrag van prestasie.

In die einde, die beste manier om te gaan met prestasie kwessies is om hulle te red vir wanneer jy data wat dui daar is 'n werklike prestasie probleem het ... anders sal jy 'n baie tyd mikro-optimalisering spandeer en eintlik veroorsaak hoër onderhoudskoste vir later op.

As jy hierdie ontleding situasie is regtig die bottelnek in jou aansoek, dan is die tyd om te probeer en uit te vind wat die vinnigste manier om op te los die probleem is. Ek dink Jeff (en baie ander) het blog oor hierdie soort ding baie.

Jy sal verskillende resultate vir die verskillende metodes te kry, afhangende van of jy stel met optimalisatie op. Jy het basies 'n paar opsies:

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 )

Jy kan maklik die opstel van 'n konsole artikels wat elk van hierdie 10,000 keer probeer en keer terug duur vir elke (toets wanneer o 'n int en wanneer dit is iets anders).

Die try-catch metode is die vinnigste as die voorwerp doen hou 'n int, en by verre die stadigste as dit nie (selfs stadiger as GetType). int.TryParse is redelik vinnig as jy 'n string, maar as jy 'n onbekende voorwerp dis stadiger.

Dit is interessant met Net 3,5 en optimalisatie aangeskakel die o is int tjek neem dieselfde tyd as try-catch wanneer o eintlik is 'n int. o is int is net 'n bietjie stadiger as o eintlik is iets anders.

lastig FxCop sal opgooi waarskuwings as jy so iets te doen:

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

Maar ek dink dit is 'n fout in FxCop -. Dit nie weet int is nie 'n waarde tipe en beveel jou om o as int plaas gebruik

As u insette is altyd 'n string int.TryParse is die beste, anders sal die is operateur is vinnigste.

As jy 'n string Ek sal kyk of jy nodig het om te weet dat dit 'n int, eerder as om 'n dubbel. As int.TryParse gaan dan sal so so double.TryParse jy kan die helfte van die aantal tjeks -. Terugkeer óf dubbel of string en vloer die dubbelspel wanneer jy 'n int verwag

Die probleem wat jy het, is dat daar situasies kan wees waar die antwoord kan wees al drie tipes.

3 kan 'n int, 'n dubbel of 'n string wees!

Dit hang af van wat jy probeer om te doen en hoe belangrik dit is dat hulle 'n spesifieke tipe. Dit mag dalk die beste wees net om hulle te verlaat as hulle so lank as wat jy kan of, alternatiewelik, 'n paar met 'n metode om elkeen te merk (as jy beheer oor die bron van die oorspronklike string het).

Ek sal persoonlik gebruik int.tryparse, dan double.tryparse. Prestasie op dié metodes is redelik vinnig. Hulle het albei terug 'n Boole. As albei misluk dan moet jy 'n string, per hoe jy jou data gedefinieer.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top