Para responder a la cuestión de si existe una función de biblioteca para encapsular este patrón - no es una función exactamente para esto, pero no es una función que le permite generar secuencias de algún estado llamado Seq.unfold
. Se puede utilizar para implementar la funcionalidad por encima de la siguiente manera:
new StreamReader(filePath) |> Seq.unfold (fun sr ->
match sr.ReadLine() with
| null -> sr.Dispose(); None
| str -> Some(str, sr))
El valor sr
representa el lector corriente y se pasa como el estado. Siempre que le proporcione valores no nulos, puede devolver Some
que contenga un elemento para generar y el estado (que podría cambiar si lo desea). Cuando dice null
, lo desechamos y devolvemos None
para finalizar la secuencia. Esto no es un equivalente directo, porque no dispone de forma adecuada StreamReader
cuando se produce una excepción.
En este caso, definitivamente utilizaría la expresión de secuencia (que es más elegante y más legible en la mayoría de los casos), pero es útil saber que también podría escribirse utilizando una función de orden superior.
Gracias! Por cierto, ¿hay una función de biblioteca para eso? –
@David - Sin duda debería haberlo. Creo que las bibliotecas .NET se están moviendo lentamente hacia más interfaces IEnumerable. – ChaosPandion
Necesitaba leer un archivo ya abierto por otro proceso, así que lo modifiqué como: 'use fs = new FileStream (filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); use sr = new StreamReader (fs) ' – User