Ich möchte einen String in C # in ein nullbares Int analysieren. dh. Ich möchte entweder den int-Wert des Strings oder null zurückgeben, wenn er nicht analysiert werden kann.
Ich hatte irgendwie gehofft, dass dies funktionieren würde
int? val = stringVal as int?;
Aber das wird nicht funktionieren. So wie ich es jetzt mache, habe ich diese Erweiterungsmethode geschrieben
public static int? ParseNullableInt(this string value)
{
if (value == null || value.Trim() == string.Empty)
{
return null;
}
else
{
try
{
return int.Parse(value);
}
catch
{
return null;
}
}
}
Gibt es einen besseren Weg, dies zu tun?
EDIT: Danke für die TryParse-Vorschläge, das wusste ich, aber es hat ungefähr genauso geklappt. Ich bin mehr daran interessiert zu wissen, ob es eine integrierte Framework-Methode gibt, die direkt in ein nullbares int analysiert wird.
Antworten:
int.TryParse
ist wahrscheinlich ein bisschen einfacher:Edit @Glenn
int.TryParse
ist "in das Framework eingebaut". Esint.Parse
ist der Weg, um Strings in Ints zu analysieren.quelle
Sie können dies in einer Zeile tun, indem Sie den bedingten Operator und die Tatsache verwenden, dass Sie
null
in einen nullbaren Typ umwandeln können (zwei Zeilen, wenn Sie kein bereits vorhandenes int haben, können Sie es für die Ausgabe von wiederverwendenTryParse
):Pre C # 7:
Mit der aktualisierten Syntax von C # 7, mit der Sie eine Ausgabevariable im Methodenaufruf deklarieren können, wird dies noch einfacher.
quelle
int.TryParse(val, out i) ? i : default(int?);
[ Aktualisiert , um modernes C # gemäß dem Vorschlag von @ sblom zu verwenden]
Ich hatte dieses Problem und endete damit (immerhin ist an
if
und 2return
s so langatmig!):Versuchen Sie im Ernst, nicht zu mischen
int
, was ein C # -Schlüsselwort ist, mitInt32
, was ein .NET Framework-BCL-Typ ist - obwohl es funktioniert, lässt es Code nur chaotisch aussehen.quelle
int i;
Zeile und gehen Sie einfach mitreturn int.TryParse (val, out var i) ? (int?) i : null;
int? ParseNInt (string val) => int.TryParse (val, out var i) ? (int?) i : null;
Es gibt diesen Ansatz, der direkt in ein nullbares int (und nicht nur in int) analysiert wird, wenn der Wert wie null oder eine leere Zeichenfolge gültig ist, aber eine Ausnahme für ungültige Werte auslöst, sodass Sie die Ausnahme abfangen und den Standardwert zurückgeben müssen für diese Situationen:
Dieser Ansatz kann weiterhin sowohl für nicht nullbare als auch für nullfähige Parses verwendet werden:
NB: Es gibt eine IsValid-Methode für den Konverter, die Sie verwenden können, anstatt die Ausnahme zu erfassen (ausgelöste Ausnahmen führen erwartungsgemäß zu unnötigem Overhead ). Leider funktioniert es erst seit .NET 4, aber es gibt immer noch ein Problem, bei dem Ihr Gebietsschema bei der Überprüfung der korrekten DateTime-Formate nicht überprüft wird (siehe Fehler 93559) .
quelle
Quellen:
quelle
Altes Thema, aber wie wäre es mit:
Ich mag dies besser als die Anforderung, wo Null analysiert werden soll, die TryParse-Version würde keinen Fehler auf zB ToNullableInt32 (XXX) werfen. Dies kann zu unerwünschten stillen Fehlern führen.
quelle
int
, sollte sie zurückkehrennull
und keine Ausnahme auslösen.Versuche dies:
quelle
Ich denke, meine Lösung ist eine sehr saubere und schöne Lösung:
Dies ist natürlich eine generische Lösung, die nur erfordert, dass das generische Argument eine statische Methode "Parse (string)" hat. Dies funktioniert für Zahlen, Boolesche Werte, DateTime usw.
quelle
Sie können alle anderen Antworten vergessen - es gibt eine großartige generische Lösung: http://cleansharp.de/wordpress/2011/05/generischer-typeconverter/
Auf diese Weise können Sie sehr sauberen Code wie folgt schreiben:
und auch:
quelle
Das Folgende sollte für jeden Strukturtyp funktionieren. Es basiert auf Code von Matt Manela aus MSDN-Foren . Wie Murph betont, kann die Ausnahmebehandlung im Vergleich zur Verwendung der Typ-dedizierten TryParse-Methode teuer sein.
Dies waren die grundlegenden Testfälle, die ich verwendet habe.
quelle
Ich würde folgende Erweiterungsmethoden für das Parsen von Zeichenfolgen in int-Werte vorschlagen, mit denen der Standardwert definiert werden kann, falls das Parsen nicht möglich ist:
quelle
Diese Lösung ist generisch ohne Reflexionsaufwand.
quelle
IsNullOrEmpty
mitIsNullOrWhitespace
Das gibt es nicht.
quelle
Ich hatte das Gefühl, ich sollte meine teilen, was etwas allgemeiner ist.
Verwendungszweck:
Lösung:
Die erste Version ist langsamer, da sie einen Try-Catch erfordert, aber sauberer aussieht. Wenn es nicht oft mit ungültigen Zeichenfolgen aufgerufen wird, ist es nicht so wichtig. Wenn die Leistung ein Problem darstellt, beachten Sie bitte, dass Sie bei Verwendung von TryParse-Methoden den Typparameter von ParseBy angeben müssen, da dieser vom Compiler nicht abgeleitet werden kann. Ich musste auch einen Delegaten definieren, da unser Schlüsselwort out nicht in Func <> verwendet werden kann, aber zumindest diesmal benötigt der Compiler keine explizite Instanz.
Schließlich können Sie es auch mit anderen Strukturen verwenden, z. B. Dezimal, DateTime, Guid usw.
quelle
Ich habe Code für eine generische NullableParser-Klasse gefunden und angepasst. Der vollständige Code befindet sich in meinem Blog Nullable TryParse
quelle
quelle
Sie sollten niemals eine Ausnahme verwenden, wenn Sie nicht müssen - der Overhead ist schrecklich.
Die Variationen von TryParse lösen das Problem - wenn Sie kreativ werden möchten (um Ihren Code eleganter aussehen zu lassen), könnten Sie wahrscheinlich etwas mit einer Erweiterungsmethode in 3.5 tun, aber der Code wäre mehr oder weniger der gleiche.
quelle
Mithilfe von Delegaten kann der folgende Code die Wiederverwendbarkeit gewährleisten, wenn Sie die nullbare Analyse für mehr als einen Strukturtyp benötigen. Ich habe hier sowohl die Versionen .Parse () als auch .TryParse () gezeigt.
Dies ist eine Beispielverwendung:
Und hier ist der Code, der Sie dorthin bringt ...
quelle
Mir ist klar, dass dies ein altes Thema ist, aber können Sie nicht einfach:
?
quelle
Ich habe mir diese ausgedacht, die meine Anforderungen erfüllt hat (ich wollte, dass meine Erweiterungsmethode die Rückgabe von TryParse des Frameworks so nah wie möglich emuliert, aber ohne try {} catch {} -Blöcke und ohne dass sich der Compiler über das Ableiten von a beschwert nullbarer Typ innerhalb der Framework-Methode)
quelle
Ich schlage Code unten vor. Sie können mit Ausnahme arbeiten, wenn ein Konvertierungsfehler aufgetreten ist.
Verwenden Sie diese Erweiterungsmethode im Code (füllen Sie die Eigenschaft int? Age einer Personenklasse aus):
ODER
quelle