Quiero analizar una cadena en un int anulable en C #. es decir. Quiero recuperar el valor int de la cadena o nulo si no se puede analizar.
Tenía la esperanza de que esto funcionara
int? val = stringVal as int?;
Pero eso no funcionará, así que la forma en que lo hago ahora es que he escrito este método de extensión
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;
}
}
}
¿Hay una mejor manera de hacer esto?
EDITAR: Gracias por las sugerencias de TryParse, lo sabía, pero funcionó de la misma manera. ¿Estoy más interesado en saber si hay un método de marco incorporado que se analizará directamente en un int con nulos?
Respuestas:
int.TryParse
es probablemente un poco más fácil:Editar @Glenn
int.TryParse
está "integrado en el marco". Es yint.Parse
es la forma de analizar cadenas a ints.fuente
Puede hacer esto en una línea, utilizando el operador condicional y el hecho de que puede convertir
null
a un tipo anulable (dos líneas, si no tiene un int preexistente puede reutilizar para la salida deTryParse
):Pre C # 7:
Con la sintaxis actualizada de C # 7 que le permite declarar una variable de salida en la llamada al método, esto se vuelve aún más simple.
fuente
int.TryParse(val, out i) ? i : default(int?);
[ Actualizado para usar C # moderno según la sugerencia de @ sblom]
Tuve este problema y terminé con esto (después de todo, ¡an
if
y 2return
s son muy largos!):En una nota más seria, intente no mezclar
int
, que es una palabra clave de C #, conInt32
, que es un tipo .CL Framework BCL, aunque funciona, solo hace que el código se vea desordenado.fuente
int i;
línea y simplemente continúe conreturn int.TryParse (val, out var i) ? (int?) i : null;
int? ParseNInt (string val) => int.TryParse (val, out var i) ? (int?) i : null;
Existe este enfoque que se analizará directamente a un int anulable (y no solo int) si el valor es válido como una cadena nula o vacía, pero arroja una excepción para valores no válidos, por lo que deberá detectar la excepción y devolver el valor predeterminado para esas situaciones:
Este enfoque todavía se puede usar para análisis no anulables y anulables:
NB: hay un método IsValid en el convertidor que puede usar en lugar de capturar la excepción (las excepciones generadas generan una sobrecarga innecesaria si se espera). Desafortunadamente, solo funciona desde .NET 4, pero todavía hay un problema en el que no comprueba su configuración regional al validar los formatos correctos de DateTime, vea el error 93559 .
fuente
Fuentes:
fuente
Viejo tema, pero ¿qué tal:
Me gusta más como el requisito de analizar nulo, la versión TryParse no arrojaría un error, por ejemplo, ToNullableInt32 (XXX). Eso puede introducir errores silenciosos no deseados.
fuente
int
, debe volvernull
, no lanzar una excepción.Prueba esto:
fuente
Siento que mi solución es una solución muy limpia y agradable:
Por supuesto, esta es una solución genérica que solo requiere que el argumento genérico tenga un método estático "Parse (string)". Esto funciona para números, booleanos, DateTime, etc.
fuente
Puede olvidarse de todas las demás respuestas: hay una gran solución genérica: http://cleansharp.de/wordpress/2011/05/generischer-typeconverter/
Esto le permite escribir código muy limpio como este:
y también:
fuente
Lo siguiente debería funcionar para cualquier tipo de estructura. Está basado en el código de Matt Manela de los foros de MSDN . Como señala Murph, el manejo de excepciones podría ser costoso en comparación con el uso del método TryParse dedicado de Tipos.
Estos fueron los casos de prueba básicos que utilicé.
fuente
Sugeriría seguir los métodos de extensión para el análisis de cadenas en valor int con la capacidad de definir el valor predeterminado en caso de que el análisis no sea posible:
fuente
Esta solución es genérica sin reflexión sobrecarga.
fuente
IsNullOrEmpty
conIsNullOrWhitespace
No hay
fuente
Sentí que debería compartir el mío, que es un poco más genérico.
Uso:
Solución:
La primera versión es más lenta ya que requiere un try-catch pero parece más limpio. Si no se llamará muchas veces con cadenas no válidas, no es tan importante. Si el rendimiento es un problema, tenga en cuenta que cuando utiliza los métodos TryParse, debe especificar el parámetro de tipo de ParseBy, ya que el compilador no puede inferirlo. También tuve que definir un delegado ya que la palabra clave out no se puede usar dentro de Func <>, pero al menos esta vez el compilador no requiere una instancia explícita.
Finalmente, puede usarlo también con otras estructuras, es decir, decimal, DateTime, Guid, etc.
fuente
Encontré y adapté un código para una clase Generic NullableParser. El código completo está en mi blog Nullable TryParse
fuente
fuente
Usted debe nunca se utilice una excepción si no tiene que - la sobrecarga es horrible.
Las variaciones en TryParse resuelven el problema: si desea ser creativo (para que su código se vea más elegante), probablemente podría hacer algo con un método de extensión en 3.5, pero el código sería más o menos el mismo.
fuente
Usando delegados, el siguiente código puede proporcionar la reutilización si necesita el análisis anulable para más de un tipo de estructura. He mostrado las versiones .Parse () y. TryParse () aquí.
Este es un ejemplo de uso:
Y aquí está el código que te lleva allí ...
fuente
Me doy cuenta de que este es un tema antiguo, pero no puedes simplemente:
?
fuente
Se me ocurrió este, que ha satisfecho mis requisitos (quería que mi método de extensión emulara lo más cerca posible el retorno del TryParse del marco, pero sin los bloques try {} catch {} y sin el compilador quejándose de inferir un tipo anulable dentro del método framework)
fuente
Sugiero el siguiente código. Puede trabajar con excepción, cuando ocurre el error de conversión.
Utilice este método de extensión en el código (rellenar int? Propiedad de edad de una clase de persona):
O
fuente