La maggior parte modo efficace di prova di tipo Object

voti
17

Ho valori memorizzati come stringhe in un DataTablein cui ogni valore potrebbe davvero rappresentare una int, doubleo string(erano tutti convertiti in stringhe nel corso di un processo di importazione da un'origine dati esterna). Ho bisogno di testare e vedere che tipo ogni valore è in realtà.

Ciò che è più efficiente per l'applicazione (o v'è alcuna differenza pratica)?

  1. Prova a convertire in int(e quindi double). Se lavori di conversione, il ritorno true. Se viene generata un'eccezione, tornare false.
  2. Le espressioni regolari progettato per abbinare il modello di una intodouble
  3. Qualche altro metodo?
È pubblicato 05/08/2008 alle 08:49
fonte dall'utente
In altre lingue...                            


5 risposte

voti
9

Userei Double.TryParse, ha vantaggi prestazionali.

Risposto il 05/08/2008 a 08:54
fonte dall'utente

voti
6

Direi, non preoccupatevi tanto di tale micro prestazioni. E 'molto meglio per ottenere solo qualcosa su cui lavorare, e quindi renderlo il più chiaro e conciso e di facile lettura il più possibile. La cosa peggiore che puoi fare è il sacrificio leggibilità per un importo non irrilevante di prestazioni.

Alla fine, il modo migliore per affrontare i problemi di prestazioni è quello di salvarli per quando si dispone di dati che indica che c'è un problema reale delle prestazioni ... altrimenti vi permetterà di trascorrere un sacco di tempo di micro-ottimizzazione e effettivamente causare un aumento dei costi di manutenzione per più tardi.

Se trovate questa situazione l'analisi è davvero il collo di bottiglia nella vostra applicazione, quindi è il momento di cercare di capire quale sia il modo più veloce per risolvere il problema. Penso che Jeff (e molti altri) hanno bloggato su questo genere di cose un sacco.

Risposto il 05/08/2008 a 09:04
fonte dall'utente

voti
5

Il problema che si ha è che ci potrebbero essere situazioni in cui la risposta potrebbe essere tutti e tre i tipi.

3 potrebbe essere un int, una doppia o una stringa!

Dipende da ciò che si sta cercando di fare e di quanto sia importante che sono un particolare tipo. Potrebbe essere meglio solo di lasciare così come sono il più a lungo possibile o, in alternativa, un po 'con un metodo per marcare ciascuno (se si ha il controllo della fonte della stringa originale).

Risposto il 23/09/2008 a 22:38
fonte dall'utente

voti
5

Otterrete risultati diversi per i diversi metodi a seconda se si compila con ottimizzazioni su. Che, fondamentalmente, alcune opzioni:

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 )

Si può facilmente impostare una console app che cerca ognuno di questi 10.000 volte e restituisce durate per ogni (prova quando o è un int e quando è qualcos'altro).

Il try-catchmetodo è il più veloce se l'oggetto sia in possesso di un int, e di gran lunga il più lento in caso negativo (ancora più lento GetType). int.TryParseè piuttosto veloce se si dispone di una stringa, ma se si dispone di un oggetto sconosciuto è più lento.

È interessante notare, con Net 3.5 e ottimizzazioni acceso il o is intcontrollo richiede contemporaneamente try-catchquando o effettivamente è un int. o is intè solo leggermente più lento se o in realtà è un'altra cosa.

Fastidiosamente FxCop getterà fino avvisi se si fa qualcosa di simile:

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

Ma penso che sia un bug in FxCop - non sa int è un tipo di valore e raccomanda di utilizzare o as intinvece.

Se il vostro input è sempre una stringa int.TryParseè meglio, altrimenti l' isoperatore è più veloce.

Come avete una stringa che avevo guardare se avete bisogno di sapere che si tratta di un int, invece di una doppia. Se int.TryParsepassa poi così sarà double.TryParsecosì si potrebbe metà del numero di controlli - restituire o doppia o una stringa e pavimento raddoppia quando ci si aspetta un int.

Risposto il 10/08/2008 a 18:43
fonte dall'utente

voti
3

Io personalmente uso int.TryParse, quindi Double.TryParse. Prestazioni su questi metodi è abbastanza veloce. Entrambi restituiscono un valore booleano. Se entrambi falliscono, allora si ha una stringa, per come si è definito i dati.

Risposto il 05/08/2008 a 09:02
fonte dall'utente

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