Aby odpowiedzieć na pytanie, czy istnieje funkcja biblioteki dla enkapsulacji ten wzór - nie jest funkcją dokładnie za to, ale nie jest to funkcja, która pozwala na generowanie sekwencji z jakiś stan zwany Seq.unfold
. Można go używać do wdrożenia funkcjonalność powyżej tak:
new StreamReader(filePath) |> Seq.unfold (fun sr ->
match sr.ReadLine() with
| null -> sr.Dispose(); None
| str -> Some(str, sr))
Wartość sr
przedstawia czytelnikowi strumienia i jest przekazywana jako państwa. Dopóki daje wartości inne niż NULL, możesz zwrócić Some
zawierający element do wygenerowania i stan (który może się zmienić, jeśli chcesz). Kiedy czyta się null
, pozbawiamy go i zwracamy None
, aby zakończyć sekwencję. Nie jest to bezpośredni odpowiednik, ponieważ nie wywołuje on prawidłowo StreamReader
podczas zgłaszania wyjątku.
W tym przypadku zdecydowanie użyłbym wyrażenia sekwencji (które jest bardziej eleganckie i bardziej czytelne w większości przypadków), ale warto wiedzieć, że można go również napisać przy użyciu funkcji wyższego rzędu.
Dzięki! Btw, czy istnieje do tego funkcja biblioteczna? –
@ David - Z pewnością powinno być. Wierzę, że biblioteki .NET powoli zmierzają w kierunku większej liczby interfejsów IEnumerable. – ChaosPandion
Musiałem przeczytać plik już otwarty przez inny proces, więc zmodyfikowałem go jako: 'use fs = new FileStream (filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); użyj sr = new StreamReader (fs) ' – User