Abhängig von Ihren spezifischen Anforderungen verfügt die .NET-Klasse DateTime über mehrere statische Methoden für Konvertieren von Zeichenfolgen in DateTime
Instanzen, dies sind DateTime.Parse
, DateTime.ParseExact
und DateTime.TryParse
und ihre verschiedenen Überladungen.
@ 7sharp9 demonstrierte den grundlegendsten Weg zur Durchführung der Datumsanalyse mit einem direkten Methodenaufruf an DateTime.Parse
. Aber wo es in F # interessant wird, ist mit DateTime.TryParse
. Während DateTime.Parse
eine Ausnahme auslöst, wenn das Parsen fehlschlägt, hat die einfachste Überladung von DateTime.TryParse
die Signatur string * byref<DateTime> -> bool
, die zurückgibt, ob das Parsen erfolgreich das Argument byref
auf das analysierte Datum setzt, wenn true, oder auf den Standardwert Wert ( null
in diesem Fall) andernfalls. Allerdings ist die Syntax für die Verwendung in F # umständlich (und in der Tat ist es aus keiner .NET-Sprache angenehm), daher wurde die F # -Sprache mit einer speziellen Funktion entworfen, die eine viel schönere Aufrufkonvention für Methoden wie diese ermöglicht, wie @Thomas Petricek zeigte aus.
Aber auch F # 's (bool, result) Rückgabetyp ist hier nicht ideal. In den meisten Fällen benötigen Sie den Standardwert nicht, wenn eine Analyse fehlschlägt. Eine schönere Signatur für DateTime.TryParse
wäre string -> option<DateTime>
. Zum Glück können wir DateTime
nach Belieben erweitern:
Wir verwenden die obige Erweiterung wie folgt:
%Vor% Dies ist konsistenter mit F # Konventionen (wie zB List.tryFind
). Aber auch das kann "besser" werden. Beachten Sie, wie wir auf das Ergebnis des try-Parsers abgleichen. Mit Partial Active Patterns (natürlich!) Können wir eine ganze Klasse von Testparsen umschließen und die Übereinstimmung für eine größere Flexibilität in den Match Case verschieben. Nimm das folgende
Mit diesen können wir eine nette kleine Konsolenanwendung schreiben:
%Vor% Der Schlüssel, der zu beachten ist, ist die verschachtelte Übereinstimmung, wobei Int
, Float
, DateTime
ihre Testpars innerhalb desselben Übereinstimmungsausdrucks ausführen.
Es gibt auch andere saubere Anwendungen dieser aktiven Muster, zum Beispiel können wir prägnant gleichzeitig eine Liste von Datumsstrings filtern und abbilden
%Vor%Um eine nette Sache zu dem hinzuzufügen, was 7sharp9 schrieb, wenn Sie auch Fehler behandeln wollen, können Sie schreiben:
%Vor% Das ist nicht offensichtlich, weil die TryParse
-Methode ein byref<DateTime>
als letztes Argument hat (und mit out
in C # verwendet wird), aber F # erlaubt es, die Methode so aufzurufen.