Pour répondre à la question de savoir s'il y a une fonction de bibliothèque pour encapsuler ce modèle - il n'y a pas une fonction exactement pour cela, mais il y a une fonction qui vous permet de générer des séquences à partir un état appelé Seq.unfold
. Vous pouvez l'utiliser pour implémenter les fonctionnalités ci-dessus comme ceci:
new StreamReader(filePath) |> Seq.unfold (fun sr ->
match sr.ReadLine() with
| null -> sr.Dispose(); None
| str -> Some(str, sr))
La valeur sr
représente le lecteur de flux et est passé comme l'état. Tant qu'il vous donne des valeurs non nulles, vous pouvez retourner Some
contenant un élément à générer et l'état (qui pourrait changer si vous le vouliez). Quand il lit null
, nous l'éliminons et retournons None
pour terminer la séquence. Ce n'est pas un équivalent direct, car il ne dispose pas correctement StreamReader
lorsqu'une exception est levée.
Dans ce cas, j'utiliserais certainement l'expression de séquence (qui est plus élégante et plus lisible dans la plupart des cas), mais il est utile de savoir qu'elle pourrait aussi être écrite en utilisant une fonction d'ordre supérieur.
Merci! BTW, existe-t-il une fonction de bibliothèque pour cela? –
@David - Il devrait certainement être. Je crois que les bibliothèques .NET évoluent lentement vers plus d'interfaces IEnumerable. – ChaosPandion
J'avais besoin de lire un fichier déjà ouvert par un autre processus donc j'ai modifié comme: 'use fs = new FileStream (filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); utilisez sr = new StreamReader (fs) ' – User