2010-12-15 95 views
1

Est-il possible d'analyser un type de données (int, double, boolean ...) dans .NET sans lancer une exception et sans renvoyer le résultat? En d'autres termes, je veux juste être en mesure de répondre à la question: «Est-ce un nombre entier valide? ou 'Est-ce un double valide?' sans avoir à déclarer une variable de résultat. Je ne veux pas utiliser .TryParse parce que je dois passer une variable de résultat, et je ne veux pas utiliser .Parse parce qu'il va lancer..NET - Parse type de données sans résultat

Des suggestions? (Je serais surpris si cette fonctionnalité n'était pas présent dans .NET, je dois manquer quelque chose.)

EDIT

Ok, c'était trop facile ... juste fait une des méthodes d'extension de couple et Je suis sur mon chemin ...

<Extension()> _ 
    Public Function IsValidInteger(ByVal value As String) As Boolean 
     Dim result As Integer 
     Return Integer.TryParse(value, result) 
    End Function 

    <Extension()> _ 
    Public Function IsValidDouble(ByVal value As String) As Boolean 
     Dim result As Double 
     Return Double.TryParse(value, result) 
    End Function 

se présente comme suit cependant, en toute honnêteté, une double question, je ne trouve pas celui-ci jusqu'à présent:

Integer.TryParse - a better way?

La réponse acceptée à partir de cette question est probablement meilleure que tout ce qui est suggéré ici.

+0

'TryParse' est aussi bon que vous allez obtenir ... – cdhowie

+3

Pourquoi TryParse un tel désagrément? –

+0

@Colin - En raison de la nécessité de lui passer une variable de résultat. Je vais peut-être jeter un coup d'œil sur ces soi-disant «méthodes d'extension» mentionnées ci-dessous. – Oceanic7

Répondre

2

Vous pouvez utiliser les différentes méthodes TryParse définies sur les types.

C'est le meilleur que vous pouvez faire sans écrire votre propre analyseur/jeton.

+0

Apparemment, vous n'avez pas besoin d'écrire votre propre analyseur/tokenizer, vous pouvez simplement utiliser ces méthodes d'extension magiques. – Oceanic7

+0

@ Oceanic7: "Magique"? C'est juste le principe ouvert/fermé en action, avec du sucre syntaxique pour le rendre un peu plus facile. – David

0

Oui, faites vos propres méthodes d'extension pour cela, les méthodes ne sont pas présentes car ce n'est pas quelque chose que les gens utilisent tous les jours. . .

public bool IsValidInt (cet int quelquechose, string toCheck) { int dontNeed; return Int.TryParse (toCheck, out dontNeed); }

0

Vous pouvez écrire vous-même une méthode d'extension qui fera le travail pour vous plus facilement que d'utiliser TryParse à chaque fois, si vous voulez juste éviter cela. Quelque chose comme:

public static bool IsValidDateFormat(this string s) 
{ 
    DateTime dt; 
    return DateTime.TryParse(s, out dt); 
} 

(Il peut y avoir une façon un peu plus élégante de le faire, je viens de jeter cela ensemble pour être compilable.)

+0

Il ne sert à rien d'initialiser 'dt' puisque vous l'utilisez ensuite comme paramètre' out' –

+0

@Tim Robinson: Bon point. Il n'est pas utilisé pour quoi que ce soit, après tout. Actualisé. – David

1

Je ne pense pas qu'il y ait quoi que ce soit dans le cadre de cette . Comme le souligne Guffa, la fourniture de telles méthodes dans le cadre serait d'une utilité limitée.

Mais si vous vouliez vraiment, vous pouvez écrire un "fondée sur les conventions-" extension méthode comme:

public static class ParseExtensions 
{ 
    public delegate bool TryParser<T>(string input, out T result); 

    public static bool CanParseTo<T>(this string text, TryParser<T> tryParser) 
    { 
     if (text == null) 
      throw new ArgumentNullException("text"); 

     if (tryParser == null) 
      throw new ArgumentNullException("tryParser"); 

     T result; 
     return tryParser(text, out result); 
    } 
} 

Utilisation (c'est un type inférence de dommage ne fonctionne pas ici):

bool intTrue = "123".CanParseTo<int>(int.TryParse); 
bool intFalse = "xxx".CanParseTo<int>(int.TryParse); 

bool enumTrue = "Encrypted".CanParseTo<FileOptions>(Enum.TryParse<FileOptions>); 
bool enumFalse = "xxx".CanParseTo<FileOptions>(Enum.TryParse<FileOptions>); 

bool dateTimeTrue = "2004/05/05".CanParseTo<DateTime>(DateTime.TryParse); 
bool dateTimeFalse = "xxx".CanParseTo<DateTime>(DateTime.TryParse); 
2

Non, il n'y a pas de telle fonctionnalité dans le framework.

La raison est qu'il y a si peu de gain à seulement déterminer si une chaîne est analysable par rapport à l'analyser réellement, que ça ne vaut pas la peine d'avoir les deux méthodes.

Presque toujours lorsque vous voulez savoir s'il est possible d'analyser une chaîne, vous devez également analyser la chaîne. S'il y avait une méthode juste savoir s'il était possible d'analyser une chaîne, il serait souvent mal utilisé de cette façon, ce qui provoque la chaîne à analyser deux fois:

if (Int32.CanParse(theString)) { 
    int n = Int32.Parse(theString); 
} 

La méthode TryParse qu'il fait en une seule opération, et cela fonctionne également dans votre cas très inhabituel, avec seulement l'inconvénient de devoir déclarer une variable pour le résultat.

0

Essayez cette fonction ci-dessous:

Vous devez ne pas écrire une extension pour toutes les combinaisons de types de base parce que cette méthode est générique. Exemple:

bool isValidInt = isValid<int>("t14"); 
//isValidInt == false 
bool isValidInt2 = isValid<int>("144"); 
//isValidInt2 == true