Je veux analyser une chaîne dans un entier nullable en C #. c'est à dire. Je veux récupérer la valeur int de la chaîne ou null si elle ne peut pas être analysée.
J'espérais que ça marcherait
int? val = stringVal as int?;
Mais cela ne fonctionnera pas, donc la façon dont je le fais maintenant est que j'ai écrit cette méthode d'extension
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;
}
}
}
Existe-t-il une meilleure façon de le faire?
EDIT: Merci pour les suggestions TryParse, je le savais, mais cela a fonctionné de la même manière. Je suis plus intéressé à savoir s'il existe une méthode de cadre intégrée qui analysera directement dans un int nullable?
Réponses:
int.TryParse
est probablement un peu plus facile:Edit @Glenn
int.TryParse
est "intégré au framework". C'est etint.Parse
sont le moyen d'analyser les chaînes en pouces.la source
Vous pouvez le faire sur une seule ligne, en utilisant l'opérateur conditionnel et le fait que vous pouvez convertir
null
en un type nullable (deux lignes, si vous n'avez pas un int préexistant, vous pouvez réutiliser pour la sortie deTryParse
):Pré C # 7:
Avec la syntaxe mise à jour de C # 7 qui vous permet de déclarer une variable de sortie dans l'appel de méthode, cela devient encore plus simple.
la source
int.TryParse(val, out i) ? i : default(int?);
[ Mis à jour pour utiliser le C # moderne selon la suggestion de @ sblom]
J'ai eu ce problème et je me suis retrouvé avec ça (après tout, un
if
et 2return
s est tellement long!):Sur une note plus sérieuse, essayez de ne pas mélanger
int
, qui est un mot clé C #, avecInt32
, qui est un type BCL .NET Framework - bien que cela fonctionne, cela rend le code désordonné.la source
int i;
ligne et allez-yreturn int.TryParse (val, out var i) ? (int?) i : null;
int? ParseNInt (string val) => int.TryParse (val, out var i) ? (int?) i : null;
Il y a cette approche qui analysera directement un int nullable (et pas seulement int) si la valeur est valide comme une chaîne nulle ou vide, mais lève une exception pour les valeurs non valides, vous devrez donc intercepter l'exception et renvoyer la valeur par défaut pour ces situations:
Cette approche peut toujours être utilisée pour les analyses non nullables ainsi que nullable:
NB: Il existe une méthode IsValid sur le convertisseur que vous pouvez utiliser au lieu de capturer l'exception (les exceptions levées entraînent un surcoût inutile si prévu). Malheureusement, cela ne fonctionne que depuis .NET 4, mais il y a toujours un problème où il ne vérifie pas vos paramètres régionaux lors de la validation des formats DateTime corrects, voir le bogue 93559 .
la source
Sources:
la source
Ancien sujet, mais que diriez-vous:
J'aime mieux cela car le requriement où analyser null, la version TryParse ne jetterait pas d'erreur par exemple ToNullableInt32 (XXX). Cela peut introduire des erreurs silencieuses indésirables.
la source
int
, elle doit retournernull
, ne pas lever d'exception.Essaye ça:
la source
Je pense que ma solution est une solution très propre et agréable:
Il s'agit bien sûr d'une solution générique qui nécessite uniquement que l'argument générique ait une méthode statique "Parse (string)". Cela fonctionne pour les nombres, booléens, DateTime, etc.
la source
Vous pouvez oublier toutes les autres réponses - il existe une excellente solution générique: http://cleansharp.de/wordpress/2011/05/generischer-typeconverter/
Cela vous permet d'écrire du code très propre comme ceci:
et aussi:
la source
Les éléments suivants devraient fonctionner pour tout type de structure. Il est basé sur le code de Matt Manela des forums MSDN . Comme le souligne Murph, la gestion des exceptions pourrait être coûteuse par rapport à l'utilisation de la méthode TryParse dédiée aux types.
Ce sont les cas de test de base que j'ai utilisés.
la source
Je suggérerais les méthodes d'extension suivantes pour l'analyse de chaîne en valeur int avec la possibilité de définir la valeur par défaut dans le cas où l'analyse n'est pas possible:
la source
Cette solution est générique sans frais généraux de réflexion.
la source
IsNullOrEmpty
parIsNullOrWhitespace
Il n'y en a pas.
la source
J'ai senti que je devrais partager le mien qui est un peu plus générique.
Usage:
Solution:
La première version est plus lente car elle nécessite un essai mais elle semble plus propre. Si elle ne sera pas appelée plusieurs fois avec des chaînes invalides, ce n'est pas si important. Si les performances sont un problème, veuillez noter que lorsque vous utilisez des méthodes TryParse, vous devez spécifier le paramètre type de ParseBy car il ne peut pas être déduit par le compilateur. J'ai également dû définir un délégué car le mot clé out ne peut pas être utilisé dans Func <>, mais au moins cette fois, le compilateur ne nécessite pas d'instance explicite.
Enfin, vous pouvez également l'utiliser avec d'autres structures, à savoir décimal, DateTime, Guid, etc.
la source
J'ai trouvé et adapté du code pour une classe Generic NullableParser. Le code complet est sur mon blog Nullable TryParse
la source
la source
Tu ne devrais jamais utiliser d'exception si vous n'êtes pas obligé - les frais généraux sont horribles.
Les variations de TryParse résolvent le problème - si vous voulez faire preuve de créativité (pour rendre votre code plus élégant), vous pourriez probablement faire quelque chose avec une méthode d'extension en 3.5 mais le code serait plus ou moins le même.
la source
À l'aide de délégués, le code suivant est en mesure de fournir une réutilisabilité si vous avez besoin de l'analyse syntaxique nullable pour plusieurs types de structure. J'ai montré les versions .Parse () et .TryParse () ici.
Ceci est un exemple d'utilisation:
Et voici le code qui vous y mène ...
la source
Je me rends compte que c'est un vieux sujet, mais ne pouvez-vous pas simplement:
?
la source
J'ai trouvé celui-ci, qui a satisfait mes exigences (je voulais que ma méthode d'extension émule le plus près possible le retour du framework TryParse, mais sans essayer les blocs {} catch {} et sans que le compilateur se plaint de déduire un type nullable dans la méthode du framework)
la source
Je suggère le code ci-dessous. Vous pouvez travailler avec exception, lorsqu'une erreur de conversion s'est produite.
Utilisez cette méthode d'extension dans le code (fill int? Propriété d'âge d'une classe de personne):
OU
la source