Wie analysiere ich einen String in einen Nullable Int
Ich wollte zum analysieren einer Zeichenfolge in eine null-int in C#. dh. Ich will wieder entweder den int-Wert des Strings oder null, wenn es nicht analysiert werden.
War ich irgendwie gehofft, dass das funktionieren würde
int? val = stringVal as int?;
Aber das wird nicht funktionieren, also so wie ich mache es jetzt ist, ich habe geschrieben diese Erweiterung Methode
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: Dank für die TryParse-Vorschläge, ich wusste darum, aber es funktionierte in etwa gleich. Ich bin mehr daran interessiert zu wissen, wenn es eine built-in-framework-Methode analysieren können direkt in einen nullable int?
Kommentar zu dem Problem
Sie können die Verwendung von string.IsNullOrEmpty(value) zu erhalten, wenn die Linie mehr Klarheit.
Betrachten Sie zu verwenden Generika Konvertierung stackoverflow.com/questions/773078/...
InformationsquelleAutor der Frage Glenn Slaven | 2008-09-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
int.TryParse
ist wahrscheinlich ein bisschen einfacher:Bearbeiten @Glenn
int.TryParse
ist ", gebaut in den Rahmen". Und esint.Parse
sind die Weg zum analysieren von Zeichenfolgen, Ganzzahlen.InformationsquelleAutor der Antwort Matt Hamilton
Können Sie dies tun, in einer Linie mit dem bedingten operator und die Tatsache, dass Sie werfen kann, ist
null
zu einem nullable-Typ (zwei Zeilen, wenn Sie nicht eine bereits bestehende int, die Sie wiederverwenden können, für die Ausgabe derTryParse
):Pre C#7:
Mit C#7 die aktualisierte syntax, die es Ihnen erlaubt zu erklären, eine output-variable in der Methode aufrufen, wird dies noch einfacher.
InformationsquelleAutor der Antwort McKenzieG1
Sorry, konnte nicht widerstehen - hatte dieses problem und Google hat mich hierher gebracht, aber ich landete mit diesem (nachdem alle, eine wenn und 2 zurücks ist soo umständlich!):
Auf eine ernstere note, versuchen Sie nicht, zu mischen int, das ist ein C# - Schlüsselwort, mit Int32, die ist ein .NET Framework BCL-Typ - obwohl es funktioniert, es macht einfach code chaotisch Aussehen.
InformationsquelleAutor der Antwort Duckboy
Es ist dieser Ansatz, analysieren die direkt an eine null-int (und nicht nur int), wenn der Wert gültig ist wie null oder leeren string, aber nicht werfen eine exception für ungültige Werte, so dass Sie brauchen, um die Ausnahme zu fangen und zurück der Standardwert für diese Situationen:
Dieser Ansatz kann weiterhin verwendet werden für nicht-null-Werte zulässt analysiert sowie nullable:
NB: Es ist eine IsValid-Methode auf dem Konverter Sie verwenden können, anstelle der Erfassung die Ausnahme (Ausnahmen ausgelöst, führt unnötiger overhead, wenn erwartet). Leider funktioniert es nur, da .NET 4, aber es gibt noch ein Problem, wo es nicht überprüfen Sie Ihre Gebietsschema, wenn die Validierung richtigen Formate für Datum und Uhrzeit, siehe bug 93559.
InformationsquelleAutor der Antwort Michael
Versuchen Sie dies:
InformationsquelleAutor der Antwort Joseph Daigle
Altes Thema, aber wie wäre es mit:
Ich mag dieses besser als das requirement where to parse null, die TryParse-version würde nicht werfen ein Fehler auf, z.B. ToNullableInt32(XXX). Das einführen kann unerwünschte silent Fehler.
InformationsquelleAutor der Antwort mortb
Können Sie vergessen alle anderen Antworten - es ist eine große generische Lösung:
http://cleansharp.de/wordpress/2011/05/generischer-typeconverter/
Dies ermöglicht es Ihnen zu schreiben sehr sauberen code wie dieser:
und auch:
InformationsquelleAutor der Antwort Pavel Hodek
Folgende arbeiten sollten für jeden struct-Typ. Es basiert auf code von Matt Manela von MSDN-Foren. Als Murph Punkte aus dem exception-handling könnte teuer werden im Vergleich zu den Arten gewidmet TryParse-Methode.
Diese waren die grundlegenden test-Fälle, die ich verwendet.
InformationsquelleAutor der Antwort Daniel Ballinger
Habe ich das Gefühl meine Lösung ist eine sehr saubere und schöne Lösung:
Dies ist natürlich eine generische Lösung, die nur verlangen, dass die Generika-argument hat eine statische Methode "Parse(string)". Dies funktioniert für zahlen, boolean, DateTime, etc.
InformationsquelleAutor der Antwort Lyskespark
Diese Lösung ist allgemein gehalten, ohne Reflexion overhead.
InformationsquelleAutor der Antwort Qi Luo
Gibt es nicht.
InformationsquelleAutor der Antwort Orion Edwards
Spürte ich, sollte ich Teile mir das ein bisschen mehr generisch.
Verwendung:
Lösung:
Erste version ist langsamer, da es erfordert eine try-catch, aber es sieht sauberer aus. Wenn es nicht zu viele Male aufgerufen werden, mit ungültigen Zeichenfolgen, ist es auch nicht wichtig.
Wenn die Leistung ein Problem, bitte beachten Sie, dass bei der Verwendung von TryParse-Methoden, müssen Sie den type-parameter von ParseBy, wie es kann nicht gefolgert werden, der vom compiler. Ich hatte auch zum definieren eines Delegierten als out-Schlüsselwort nicht verwendet werden können, innerhalb von Func<>, aber zumindest dieses mal-compiler erfordert keine explizite Instanz.
Schließlich, Sie können es mit anderen Strukturen, nämlich decimal, DateTime, Guid, etc.
InformationsquelleAutor der Antwort orcun
Habe ich gefunden und angepasst code für eine Generische NullableParser Klasse. Der vollständige code ist auf meinem blog Nullable TryParse
InformationsquelleAutor der Antwort John Dauphine
Habe ich mit kommen dieses hier, das erfüllt meine Anforderungen (ich wollte meine Erweiterung Methode zu emulieren, so nah wie möglich die Rückkehr von framework TryParse, aber ohne try{} catch {} - Blöcke und ohne dass der compiler meckert über die Herleitung eines nullable-Typ innerhalb der framework-Methode)
InformationsquelleAutor der Antwort wmoecke
InformationsquelleAutor der Antwort Crivelli
Sollten Sie nie verwenden, eine Ausnahme, wenn Sie nicht müssen - der Aufwand ist schrecklich.
Varianten TryParse das problem lösen - wenn Sie möchten, um kreativ zu werden (um Ihren code zu mehr elegant Aussehen), Sie könnten wahrscheinlich etwas zu tun mit einer Erweiterung Methode in 3.5, aber der code wäre mehr oder weniger das gleiche.
InformationsquelleAutor der Antwort Murph
Verwendung von Stellvertretern, den folgenden code in der Lage ist, die Wiederverwendbarkeit, wenn Sie feststellen, selbst benötigen, die nullable-Analyse für mehr als eine Struktur geben. Ich habe gezeigt, sowohl die .Parse() und .TryParse () - Versionen hier.
Dies ist ein Beispiel für die Verwendung:
Und hier ist der code, bekommt Sie es...
InformationsquelleAutor der Antwort umbyersw
Schlage ich code unten. Sie arbeiten vielleicht mit Ausnahme beim konvertieren Fehler aufgetreten.
Diese Erweiterung-Methode im code (fill int? Age-Eigenschaft der person-Klasse):
ODER
InformationsquelleAutor der Antwort lison
Ich würde vorschlagen, folgende Erweiterung der Methoden für das string-Parsen in int-Wert mit der Fähigkeit zu definieren, default-Wert bei der Analyse nicht möglich:
InformationsquelleAutor der Antwort Aleksandr Neizvestnyy
Merke ich, das ist ein altes Thema, aber kannst du nicht einfach:
?
InformationsquelleAutor der Antwort Leigh Bowers