c# - Effizienteste Methode zum Testen des Objekttyps

Translate

Ich habe Werte als Zeichenfolgen in a gespeichertDataTablewo jeder Wert wirklich ein darstellen könnteint, double, oderstring(Sie wurden alle während eines Importvorgangs aus einer externen Datenquelle in Zeichenfolgen konvertiert.) Ich muss testen und sehen, welcher Typ jeder Wert wirklich ist.

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

  1. Versuchen Sie zu konvertierenint(und danndouble). Wenn die Konvertierung funktioniert, erfolgt die Rückgabetrue. Wenn eine Ausnahme ausgelöst wird, kehren Sie zurückfalse.
  2. Reguläre Ausdrücke, die dem Muster eines entsprechenintoderdouble
  3. Eine andere Methode?
This question and all comments follow the "Attribution Required."

Alle Antworten

gil
Translate

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

Quelle
Translate

Ich würde sagen, mach dir nicht so viele Sorgen um diese Mikroleistung. Es ist viel besser, einfach etwas zum Laufen zu bringen und es dann so klar und präzise und einfach wie möglich zu lesen. Das Schlimmste, was Sie tun können, ist, die Lesbarkeit für eine unbedeutende Leistung zu opfern.

Der beste Weg, um Leistungsprobleme zu lösen, besteht darin, sie zu speichern, wenn Sie Daten haben, die darauf hinweisen, dass ein tatsächliches Leistungsproblem vorliegt. Andernfalls verbringen Sie viel Zeit mit der Mikrooptimierung und verursachen tatsächlich höhere Wartungskosten für später.

Wenn Sie feststellen, dass diese Analyse-Situation wirklich der Engpass in Ihrer Anwendung ist, ist es an der Zeit, herauszufinden, wie das Problem am schnellsten gelöst werden kann. Ich denke, Jeff (und viele andere) haben viel über solche Dinge gebloggt.

Quelle
Translate

Sie erhalten unterschiedliche Ergebnisse für die verschiedenen Methoden, je nachdem, ob Sie mit Optimierungen kompilieren. Sie haben grundsätzlich einige Möglichkeiten:

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 ganz einfach eine Konsolen-App einrichten, die diese 10.000 Versuche ausführt und für jeden eine Dauer zurückgibt (testen Sie, wann o ein int ist und wann es etwas anderes ist).

Dastry-catchMethode ist die schnellste, wenn das Objekt ein int enthält, und bei weitem die langsamste, wenn dies nicht der Fall ist (sogar langsamer alsGetType).int.TryParseist ziemlich schnell, wenn Sie eine Zeichenfolge haben, aber wenn Sie ein unbekanntes Objekt haben, ist es langsamer.

Interessanterweise wurde mit .Net 3.5 und Optimierungen die aktivierto is intÜberprüfung dauert die gleiche Zeit wietry-catchwenn o tatsächlich ein int ist.o is intist nur etwas langsamer, wenn o tatsächlich etwas anderes ist.

Ärgerlicherweise gibt FxCop Warnungen aus, wenn Sie Folgendes tun:

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

Aber ich denke, das ist ein Fehler in FxCop - es weiß nicht, dass int ein Werttyp ist und empfiehlt die Verwendungo as intstattdessen.

Wenn Ihre Eingabe immer eine Zeichenfolge istint.TryParseist am besten, sonst dieisBediener ist am schnellsten.

Da Sie eine Zeichenfolge haben, würde ich prüfen, ob Sie wissen müssen, dass es sich um ein Int und nicht um ein Double handelt. Wennint.TryParsevergeht dann so wirddouble.TryParseSie können also die Hälfte der Überprüfungen durchführen - geben Sie entweder double oder string zurück und legen Sie die Doubles fest, wenn Sie ein int erwarten.

Quelle
Translate

Das Problem, das Sie haben, ist, dass es Situationen geben kann, in denen die Antwort alle drei Typen sein kann.

3 könnte ein int, ein double oder ein string sein!

Es hängt davon ab, was Sie versuchen und wie wichtig es ist, dass es sich um einen bestimmten Typ handelt. Es ist möglicherweise am besten, sie so lange wie möglich zu belassen oder alternativ eine Methode zum Markieren der einzelnen Zeichen festzulegen (wenn Sie die Kontrolle über die Quelle der ursprünglichen Zeichenfolge haben).

Quelle
Translate

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

Quelle