我剛開始使用F#玩的第一個元素,所以這個問題可能會相當基本的...省略在F#數組
我想逐行讀取文本文件中的行,然後忽略第一行並使用給定函數處理其他行。所以我正在考慮沿用以下方法:
File.ReadAllLines(path)
|> Array.(ignore first element)
|> Array.map processLine
什麼是一種優雅而有效的方式來實現它?
我剛開始使用F#玩的第一個元素,所以這個問題可能會相當基本的...省略在F#數組
我想逐行讀取文本文件中的行,然後忽略第一行並使用給定函數處理其他行。所以我正在考慮沿用以下方法:
File.ReadAllLines(path)
|> Array.(ignore first element)
|> Array.map processLine
什麼是一種優雅而有效的方式來實現它?
沒有簡單的函數可以跳過數組中的第一行,因爲操作效率不高(它必須複製整個數組),但如果使用惰性序列,則可以輕鬆完成:
File.ReadAllLines(path)
|> Seq.skip 1
|> Seq.map processLine
如果需要在陣列中(相對於seq<'T>
,這是一個IEnumerable<'T>
F#別名)的結果,那麼可以添加Seq.toArray
到最後。但是,如果您只是想稍後迭代線路,那麼您可能只是使用序列。
這是對托馬斯的答案的補充,我普遍認同這一點。有一件事要注意,如果你的數組或序列不包含行,會發生什麼。 (或者比你想跳過的行更少)。在這種情況下,Seq.skip會拋出異常。解決這個,我能想到的最簡潔的方式是:
System.IO.File.ReadAllLines fileName
|> Seq.mapi (fun i elem -> i, elem)
|> Seq.choose (fun (i, elem) -> if i > 0 then Some(elem) else None)
您只需通過myArray.[1..]
跳過的F#數組的第一個元素。要愛這種語言是多麼優雅。