2011-10-06 3 views
13

Je voudrais essayer d'analyser un string comme un DateTime?, et si elle échoue, définissez la valeur à null. La seule façon dont je peux penser à faire ceci est la suivante, mais cela ne semble pas très soigné.TryParse à un type Nullable

DateTime temp; 
DateTime? whatIActuallyWant = null; 
if (DateTime.TryParse(txtDate.Text, out temp)) whatIActuallyWant = temp; 

Est-ce la seule façon?

+1

Envisagez d'utiliser la conversion générique http://stackoverflow.com/questions/773078/convert-string-to-nullable-type-int-double-etc –

+0

Copie possible de [Generic TryParse] (http: // stackoverflow. com/questions/2961656/generic-tryparse) –

Répondre

23

Que diriez-vous ceci:

DateTime? whatIActuallyWant = DateTime.TryParse(txtDate.Text, out temp) ? (DateTime?)temp : null; 

vous obtenez une seule ligne de ce (malheureusement besoin la distribution DateTime? autrement ne compilera pas) - mais personnellement je ne serais probablement en tenir à l'initialisation null et la suivante if - c'est juste plus facile à lire.

+0

J'ai déjà essayé ça, mais ça revient l'erreur: Le type d'expression conditionnelle ne peut pas être déterminé car il n'y a pas de conversion implicite entre 'System.DateTime' et ''. – James

+0

@James: voir le casting à 'DateTime?' - malheureusement, c'est nécessaire parce que les deux termes doivent être implicitement convertibles - une alternative est '? temp: (DateTime?) null; ' – BrokenGlass

+0

@James, regardons ceci. Vous devez déclarer la variable 'temp', ajoutez donc cette ligne. Nous avons donc ramené 3 lignes de votre code à 2. Cette version est-elle plus ou moins lisible? Nous devons faire défiler pour voir tout cela. Plus ou moins complexe? Nous avons introduit un casting. Une demi-douzaine dans une main, 6 dans l'autre, si vous me demandez. –

15

Si vous allez être effectuer plus d'une fois je recommande cette opération en ajoutant une méthode simple d'extension pour la facilité d'utilisation ...

public static class Extensions 
{ 
    public static DateTime? ToDateTime(this string val) 
    { 
     DateTime temp; 
     if (DateTime.TryParse(val, out temp)) 
      return temp; 
     else 
      return null; 
    } 
} 

que vous pouvez ensuite utiliser très facilement ...

DateTime? ret1 = "01/01/2011".ToDateTime(); 
DateTime? ret2 = myString.ToDateTime(); 
Questions connexes