Zur Beantwortung der Frage, ob es eine Bibliotheksfunktion zum Einkapseln dieses Musters ist - gibt es keine Funktion genau für diese, aber es gibt eine Funktion, die Sie Sequenz generieren kann von einigem Zustand Seq.unfold
genannt . Sie können es verwenden, um die Funktionalität oben wie folgt umzusetzen:
new StreamReader(filePath) |> Seq.unfold (fun sr ->
match sr.ReadLine() with
| null -> sr.Dispose(); None
| str -> Some(str, sr))
Der sr
Wert stellt den Stromleser und wird als der Staat übergeben. Solange es Ihnen Nicht-Null-Werte gibt, können Sie Some
mit einem zu generierenden Element und dem Status (der sich ändern könnte, wenn Sie möchten) zurückgeben. Wenn es null
liest, entsorgen wir es und geben None
zurück, um die Sequenz zu beenden. Dies ist kein direktes Äquivalent, da StreamReader
beim Auslösen einer Ausnahme nicht ordnungsgemäß entsorgt wird.
In diesem Fall würde ich definitiv Sequenzausdruck verwenden (der in den meisten Fällen eleganter und lesbarer ist), aber es ist nützlich zu wissen, dass er auch mit einer Funktion höherer Ordnung geschrieben werden könnte.
Dank! Übrigens, gibt es dafür eine Bibliotheksfunktion? –
@David - Es sollte sicherlich sein. Ich glaube, die .NET-Bibliotheken bewegen sich langsam hin zu mehr IEnumerable-Schnittstellen. – ChaosPandion
Ich musste eine Datei lesen, die bereits von einem anderen Prozess geöffnet wurde, also änderte ich: 'uses fs = new FileStream (Dateipfad, Dateimodus.Öffnen, Dateizugriff.Read, DateiShare.ReadWrite); Verwenden Sie sr = new StreamReader (fs) ' – User