Effizienteste Weg Objekttyp Test

stimmen
17

Ich habe Werte als Zeichenfolgen in einer gespeicherten DataTablewobei jeder Wert wirklich ein darstellen könnte int, doubleoder string(sie alle Saiten während eines Importvorgangs von einer externen Datenquelle umgewandelt wurden). Ich brauche zu testen und zu sehen , welche Art jeden Wert wirklich ist.

Was ist effizienter für die Anwendung (oder gibt es keinen praktischen Unterschied)?

  1. Versuchen Sie , zu konvertieren int(und dann double). Wenn Umbauarbeiten, die Rückkehr true. Wenn eine Ausnahme ausgelöst wird, zurückkehren false.
  2. Reguläre Ausdrücke entwickelt , um die Muster eines anzupassen intoderdouble
  3. Einige andere Methode?
Veröffentlicht am 05/08/2008 um 08:49
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
9

Würde verwenden Double.TryParse, hat es Leistungsvorteile.

Beantwortet am 05/08/2008 um 08:54
quelle vom benutzer

stimmen
6

Ich würde sagen, nicht so viel über solche Mikro Leistung sorgen. Es ist viel besser, nur etwas zu arbeiten, und dann macht es so klar und präzise und einfach wie möglich zu lesen. Das Schlimmste, was man tun kann, ist Opfer Lesbarkeit für eine unbedeutende Menge an Leistung.

Am Ende der beste Weg, mit Performance-Problemen zu behandeln ist, sie zu speichern, wenn Sie Daten, die es gibt ein tatsächliches Performance-Problem ... sonst werden Sie viel Zeit Mikro-Optimierung verbringen und tatsächlich dazu führen, höhere Wartungskosten für später.

Wenn Sie diese Analyse Situation wirklich der Engpass in der Anwendung ist, DANN ist die Zeit, um zu versuchen, herauszufinden, was der schnellste Weg, das Problem zu lösen. Ich denke, Jeff (und viele andere) haben über diese Art der Sache viel gebloggt.

Beantwortet am 05/08/2008 um 09:04
quelle vom benutzer

stimmen
5

Die Mühe, die Sie haben, ist, dass es Situationen geben kann, wo die Antwort alle drei Typen sein könnte.

3 könnte ein int, ein Doppel- oder ein String sein!

Es hängt davon ab, was Sie versuchen zu tun, und wie wichtig es ist, dass sie eine bestimmte Art sind. Es wäre am besten, nur um sie zu verlassen, wie sie so lange, wie Sie sind können oder alternativ einige sich mit einem Verfahren jedes markieren (wenn Sie die Kontrolle über die Quelle des ursprünglichen Zeichenfolge haben).

Beantwortet am 23/09/2008 um 22:38
quelle vom benutzer

stimmen
5

Sie werden unterschiedliche Ergebnisse für die verschiedenen Methoden, je nachdem, ob Sie kompilieren mit Optimierungen auf. Sie haben grundsätzlich ein paar Optionen:

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 )

Sie können eine Konsole App einfach einrichten, dass jedes dieser 10.000-mal und gibt Dauern für jede versucht (Test, wenn o ein int ist und wenn es etwas anderes).

Die try-catchMethode ist die schnellste , wenn das Objekt einen int tut halten, und bei weitem die langsamsten , wenn dies nicht der Fall (noch langsamer als GetType). int.TryParsewenn Sie ist ziemlich schnell eine Zeichenfolge haben, aber wenn Sie ein unbekanntes Objekt haben , ist es langsamer.

Interessanterweise mit .Net 3.5 und Optimierungen auf dem einge o is intCheck nimmt die gleiche Zeit wie try-catchwenn o tatsächlich ist ein int. o is intnur etwas langsamer , wenn o eigentlich etwas anderes.

Nervend wird FxCop auf Warnungen aus, wenn Sie so etwas tun:

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

Aber ich denke , dass ein Fehler in FxCop ist - es ist nicht int weiß ein Werttyp ist , und empfiehlt , den Sie zu verwenden o as intstattdessen.

Wenn Sie Ihre Eingabe ist immer ein String int.TryParseist am besten, da sonst der isBetreiber schnellste.

Wie Sie eine Zeichenfolge haben würde ich schauen , ob Sie müssen wissen , dass es ein int ist, eher als ein Doppelzimmer. Wenn int.TryParsePässe dann so und double.TryParseso kann man die halbe Anzahl der Kontrollen - Doppel- oder String und Boden im Doppel zurück , wenn Sie erwarten ein int.

Beantwortet am 10/08/2008 um 18:43
quelle vom benutzer

stimmen
3

Ich würde persönlich benutze int.TryParse, dann Double.TryParse. Performance auf diesen Methoden ist recht schnell. Beide geben einen Boolean. Wenn beide ausfallen, dann haben Sie eine Zeichenfolge, pro, wie Sie Ihre Daten definiert.

Beantwortet am 05/08/2008 um 09:02
quelle vom benutzer

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