2008-08-05 11 views
16

I-Werte als Strings in einem DataTable gespeichert haben, wo jeder Wert wirklich ein int, double oder string (sie wurden alle in Strings umgewandelt während eines Importvorgangs von einer externen Datenquelle) darstellen könnte. Ich muss testen und sehen, welcher Typ wirklich jeder Wert ist.effizienteste Weg Objekttyp Test

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

  1. Versuchen Sie, int (und dann double) zu konvertieren. Wenn die Konvertierung funktioniert, geben Sie true zurück. Wenn eine Ausnahme ausgelöst wird, geben Sie false zurück.
  2. Reguläre Ausdrücke entworfen, um das Muster eines int oder double
  3. eine andere Methode?

Antwort

9

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

3

Ich würde persönlich int.tryparse verwenden, dann double.tryparse. Die Leistung dieser Methoden ist ziemlich schnell. Beide geben einen Booleschen Wert zurück. Wenn beide fehlschlagen, haben Sie eine Zeichenfolge, wie Sie Ihre Daten definiert haben.

6

Ich würde sagen, mach dir keine Sorgen über solche Mikro-Performance. Es ist viel besser, einfach etwas zur Arbeit zu bringen und es dann so klar und prägnant und leicht lesbar wie möglich zu machen. Das Schlimmste, was Sie tun können, ist Lesbarkeit für eine unbedeutende Menge an Leistung zu opfern.

Am Ende ist der beste Weg, mit Leistungsproblemen umzugehen, sie zu speichern, wenn Sie Daten haben, die auf ein tatsächliches Leistungsproblem hinweisen ... sonst werden Sie viel Zeit mit der Mikrooptimierung verbringen und tatsächlich verursachen höhere Wartungskosten für später.

Wenn Sie feststellen, dass diese Parsing-Situation wirklich der Engpass in Ihrer Anwendung ist, dann ist es an der Zeit, herauszufinden, was der schnellste Weg zur Lösung des Problems ist. Ich denke, Jeff (und viele andere) haben viel über diese Art von Dingen gebloggt.

5

Sie erhalten unterschiedliche Ergebnisse für die verschiedenen Methoden, je nachdem, ob Sie mit Optimierungen kompilieren. Sie haben im Grunde 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 einfach eine Konsole-Anwendung, die jedes dieser 10.000-mal versucht und gibt Dauern für jeden einrichten kann (Test, wenn o ein int ist und wenn es etwas anderes).

Die Methode try-catch ist am schnellsten, wenn das Objekt einen int enthält, und bei weitem die langsamste, wenn nicht (sogar langsamer als GetType). int.TryParse ist ziemlich schnell, wenn Sie eine Zeichenfolge haben, aber wenn Sie ein unbekanntes Objekt haben, ist es langsamer.

Interessanterweise, mit .Net 3.5 und Optimierungen eingeschaltet die o is int Prüfung dauert die gleiche Zeit wie try-catch, wenn o tatsächlich ein int ist. o is int ist nur etwas langsamer, wenn o eigentlich etwas anderes ist.

Ärgerlicher 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 nicht weiß, int ein Werttyp und empfiehlt o as int stattdessen zu verwenden.

Wenn Ihre Eingabe immer eine Zeichenfolge int.TryParse ist, ist am besten, is Operator ist am schnellsten.

Da Sie eine Zeichenfolge haben, würde ich sehen, ob Sie wissen müssen, dass es ein Int ist, anstatt ein Doppel. Wenn int.TryParse geht dann wird auch so double.TryParse so können Sie die Hälfte der Anzahl der Schecks - zurückgeben, entweder Double oder String und Boden die Doppelgänger, wenn Sie eine int erwarten.

5

Das Problem, das Sie haben, ist, dass es Situationen geben könnte, in denen 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 ein bestimmter Typ sind. Es ist vielleicht am besten, sie so lange wie möglich zu lassen oder alternativ mit einer Methode, um jeden zu markieren (wenn Sie die Quelle der ursprünglichen Zeichenkette kontrollieren).

+0

Das ultimative Ziel war es, den exklusivsten Datentyp für das Objekt zu ermitteln. 3 wäre ein Int. 3.5 wäre ein Doppel. "Drei" wäre eine Zeichenfolge. Ich stellte schließlich eine Funktion zusammen, die eine Menge von object.TryParse-Aufrufen ausprobierte, bis sie herausfinden konnte, was der "am besten passende" Datentyp war. –

Verwandte Themen