Chcę parsować ciąg do nullable int w C #. to znaczy. Chcę odzyskać wartość int łańcucha lub wartość null, jeśli nie można go przeanalizować.
Miałem nadzieję, że to zadziała
int? val = stringVal as int?;
Ale to nie zadziała, więc teraz robię to, że napisałem tę metodę rozszerzenia
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;
}
}
}
Czy jest na to lepszy sposób?
EDYCJA: Dzięki za sugestie TryParse, wiedziałem o tym, ale działało to tak samo. Bardziej interesuje mnie wiedza, czy istnieje wbudowana metoda frameworka, która będzie przetwarzać bezpośrednio w nullable int?
Odpowiedzi:
int.TryParse
jest chyba odrobinę łatwiejsze:Edycja @Glenn
int.TryParse
jest „wbudowana w środowisko”. To iint.Parse
są sposób analizowania ciągi do wskazówki.źródło
Możesz to zrobić w jednym wierszu, używając operatora warunkowego i faktu, że możesz rzutować
null
na typ zerowalny (dwa wiersze, jeśli nie masz wcześniej istniejącej zmiennej int, możesz użyć jej ponownieTryParse
):Przed C # 7:
Dzięki zaktualizowanej składni C # 7, która pozwala zadeklarować zmienną wyjściową w wywołaniu metody, staje się to jeszcze prostsze.
źródło
int.TryParse(val, out i) ? i : default(int?);
[ Zaktualizowano, aby używać nowoczesnego języka C # zgodnie z sugestią @ sblom]
Miałem ten problem i skończyłem z tym (w końcu,
if
a 2return
s jest zbyt długa!):Mówiąc poważniej, staraj się nie mieszać
int
, który jest słowem kluczowym C #, zInt32
typem BCL .NET Framework - chociaż działa, to po prostu sprawia, że kod wygląda na niechlujny.źródło
int i;
linię i po prostu idź zreturn int.TryParse (val, out var i) ? (int?) i : null;
int? ParseNInt (string val) => int.TryParse (val, out var i) ? (int?) i : null;
Istnieje takie podejście, które będzie analizować bezpośrednio do zerowalnej wartości int (a nie tylko int), jeśli wartość jest poprawna, jak null lub pusty ciąg, ale zgłasza wyjątek dla niepoprawnych wartości, więc trzeba będzie złapać wyjątek i zwrócić wartość domyślną w takich sytuacjach:
To podejście może być nadal stosowane w przypadku analiz składni, które nie mają wartości NULL, a także wartości NULL:
Uwaga: W konwerterze istnieje metoda IsValid, której można użyć zamiast przechwytywania wyjątku (zgłoszone wyjątki powodują niepotrzebne koszty ogólne, jeśli się tego spodziewają). Niestety działa tylko od .NET 4, ale nadal występuje problem polegający na tym, że nie sprawdza on ustawień regionalnych podczas sprawdzania poprawności formatów DateTime, patrz błąd 93559 .
źródło
Źródła:
źródło
Stary temat, ale co powiesz na:
Podoba mi się to bardziej jako wymaganie, gdzie do parsowania null, wersja TryParse nie rzucałaby błędu np. Na ToNullableInt32 (XXX). Może to powodować niechciane ciche błędy.
źródło
int
, powinien powrócićnull
, a nie zgłosić wyjątek.Spróbuj tego:
źródło
Wydaje mi się, że moje rozwiązanie jest bardzo czyste i ładne:
Jest to oczywiście ogólne rozwiązanie, które wymaga tylko, aby argument ogólny miał statyczną metodę „Analiza składni (ciąg)”. Działa to dla liczb, wartości logicznych, daty i godziny itp.
źródło
Możesz zapomnieć o wszystkich innych odpowiedziach - istnieje świetne ogólne rozwiązanie: http://cleansharp.de/wordpress/2011/05/generischer-typeconverter/
Pozwala to napisać bardzo czysty kod w następujący sposób:
i również:
źródło
Poniższe powinno działać dla każdego typu struktury. Jest oparty na kodzie Matta Maneli z forów MSDN . Jak zauważa Murph, obsługa wyjątków może być kosztowna w porównaniu z użyciem dedykowanej metody TryParse typu.
To były podstawowe przypadki testowe, których użyłem.
źródło
Sugerowałbym zastosowanie następujących metod rozszerzenia do parsowania łańcucha na wartość int z możliwością zdefiniowania wartości domyślnej w przypadku, gdy parsowanie nie jest możliwe:
źródło
To rozwiązanie jest ogólne bez refleksji.
źródło
IsNullOrEmpty
zIsNullOrWhitespace
Nie ma
źródło
Czułem, że powinienem podzielić się moim, który jest nieco bardziej ogólny.
Stosowanie:
Rozwiązanie:
Pierwsza wersja jest wolniejsza, ponieważ wymaga próby, ale wygląda na czystszą. Jeśli nie zostanie wywołany wiele razy z niepoprawnymi łańcuchami, nie jest to takie ważne. Jeśli wydajność stanowi problem, należy pamiętać, że podczas korzystania z metod TryParse należy określić parametr typu ParseBy, ponieważ kompilator nie może wywnioskować. Musiałem także zdefiniować delegata, ponieważ słowa kluczowego out nie można używać w Func <>, ale przynajmniej tym razem kompilator nie wymaga jawnej instancji.
Wreszcie możesz używać go również z innymi strukturami, np. Dziesiętnymi, DateTime, Guid itp.
źródło
Znalazłem i zaadaptowałem trochę kodu dla ogólnej klasy NullableParser. Pełny kod znajduje się na moim blogu Nullable TryParse
źródło
źródło
Nigdy nie powinieneś używać wyjątku, jeśli nie musisz - koszty ogólne są okropne.
Odmiany w TryParse rozwiązują problem - jeśli chcesz być kreatywny (aby Twój kod wyglądał bardziej elegancko), możesz prawdopodobnie zrobić coś z metodą rozszerzenia w wersji 3.5, ale kod byłby mniej więcej taki sam.
źródło
Korzystając z delegatów, poniższy kod jest w stanie zapewnić możliwość ponownego użycia, jeśli okaże się, że potrzebujesz parsowania dla więcej niż jednego typu struktury. Pokazałem tutaj zarówno wersje .Parse (), jak i .TryParse ().
To jest przykładowe użycie:
A oto kod, który Cię tam prowadzi ...
źródło
Zdaję sobie sprawę, że to stary temat, ale czy nie możesz po prostu:
?
źródło
Wymyśliłem ten, który spełnił moje wymagania (chciałem, aby moja metoda rozszerzenia naśladowała jak najbliższy zwrot TryParse frameworka, ale bez bloków try {} catch {} i bez kompilatora narzekającego na wnioskowanie o typ dopuszczalny w ramach metody ramowej)
źródło
Sugeruję poniższy kod. Możesz pracować z wyjątkiem, gdy wystąpił błąd konwersji.
Użyj tej metody rozszerzenia w kodzie (wypełnij int? Właściwość Age klasy osoby):
LUB
źródło