Frage

Ich habe Werte als Zeichenfolgen in a gespeichert DataTable wobei jeder Wert wirklich einen darstellen könnte int, double, oder string (Sie wurden alle während eines Importvorgangs aus einer externen Datenquelle in Zeichenfolgen konvertiert.)Ich muss testen und sehen, um welchen Typ es sich bei den einzelnen Werten wirklich handelt.

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

  1. Versuchen Sie zu konvertieren int (und dann double).Wenn die Konvertierung funktioniert, erfolgt die Rückgabe true.Wenn eine Ausnahme ausgelöst wird, kehren Sie zurück false.
  2. Reguläre Ausdrücke, die so gestaltet sind, dass sie dem Muster eines entsprechen int oder double
  3. Eine andere Methode?
War es hilfreich?

Lösung

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

Andere Tipps

Ich würde sagen, machen Sie sich über eine solche Mikroleistung keine so großen Sorgen.Es ist viel besser, etwas einfach zum Laufen zu bringen und es dann so klar, prägnant und leicht lesbar wie möglich zu gestalten.Das Schlimmste, was Sie tun können, ist, die Lesbarkeit für eine unbedeutende Leistung zu opfern.

Der beste Weg, mit Leistungsproblemen umzugehen, besteht letztendlich darin, sie für den Fall aufzubewahren, dass Daten vorliegen, die darauf hinweisen, dass tatsächlich ein Leistungsproblem vorliegt ...Andernfalls verbringen Sie viel Zeit mit der Mikrooptimierung und verursachen später tatsächlich höhere Wartungskosten.

Wenn Sie feststellen, dass diese Parsing-Situation wirklich den Engpass in Ihrer Anwendung darstellt, DANN ist es an der Zeit, herauszufinden, wie sich das Problem am schnellsten lösen lässt.Ich denke, Jeff (und viele andere) haben viel über solche Dinge gebloggt.

Sie erhalten unterschiedliche Ergebnisse für die verschiedenen Methoden, je nachdem, ob Sie mit aktivierten Optimierungen kompilieren.Grundsätzlich haben Sie mehrere 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 jeden dieser Schritte 10.000 Mal ausprobiert und jeweils die Dauer zurückgibt (testen Sie, wann o ein int ist und wann es etwas anderes ist).

Der try-catch Die Methode ist am schnellsten, wenn das Objekt ein int enthält, und bei weitem am langsamsten, wenn dies nicht der Fall ist (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 aktivierten Optimierungen o is int Die Überprüfung dauert genauso lange wie try-catch wenn o tatsächlich ein int ist. o is int ist nur geringfügig langsamer, wenn o tatsächlich etwas anderes ist.

Ärgerlicherweise gibt FxCop Warnungen aus, wenn Sie etwas tun wie:

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 Ihnen die Verwendung o as int stattdessen.

Wenn Ihre Eingabe immer eine Zeichenfolge ist int.TryParse ist am besten, sonst das is Der Operator 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.Wenn int.TryParse vergeht dann auch double.TryParse Sie könnten also die Anzahl der Prüfungen halbieren – entweder Double oder String zurückgeben und die Doubles auf den Boden legen, wenn Sie ein Int erwarten.

Das Problem, das Sie haben, besteht darin, dass es Situationen geben kann, in denen die Antwort alle drei Arten sein kann.

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

Es hängt davon ab, was Sie tun möchten und wie wichtig es ist, dass es sich um einen bestimmten Typ handelt.Vielleicht ist es am besten, sie einfach so lange wie möglich zu belassen oder sich alternativ eine Methode zum Markieren jeder einzelnen Zeichenfolge auszudenken (sofern Sie die Kontrolle über die Quelle der Originalzeichenfolge haben).

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 beides fehlschlägt, haben Sie eine Zeichenfolge, je nachdem, wie Sie Ihre Daten definiert haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top