【发布时间】:2017-01-13 08:28:56
【问题描述】:
我已设法读取包含逐行随机数的文本文件。当我使用printfn "%A" lines 输出行时,我得到seq ["45"; "5435" "34"; ... ],所以我假设行必须是数据类型列表。
open System
let readLines filePath = System.IO.File.ReadLines(filePath);;
let lines = readLines @"C:\Users\Dan\Desktop\unsorted.txt"
我现在尝试按从低到高对列表进行排序,但它没有 .sortBy() 方法。任何人都可以告诉我如何手动执行此操作?我试过把它变成一个数组来排序,但它不起作用。
let array = [||]
let counter = 0
for i in lines do
array.[counter] = i
counter +1
Console.ReadKey <| ignore
提前致谢。
【问题讨论】:
-
这是一个序列,而不是一个列表。试试
Seq.sortBy。 -
那么,它看起来像
let sorted = lines.Seq.sortBy吗? @rmunn -
没有。
Seq.sortBy是一个函数,而不是一个方法。应该是let sorted = Seq.sortBy int lines,或let sorted = lines |> Seq.sortBy int。 -
需要意识到的一点是,序列是惰性的,只有在需要它们的内容时才会生成它们的内容。然后您将只能获取一次 seq 的内容,否则您将收到“错误:无法从关闭的 TextReader 中读取”。如果您来自 C# 背景,请记住 F# 序列与 C# 中的
IEnumerable完全相同,并且您基本上会做对。 -
请注意,other 序列可以很好地重复生成它们的值。这只是您从
System.IO.File.ReadLines获得的序列(IEnumerable),您将无法重复。如果您需要重复遍历其值,请将其存储在列表或数组中,通过let storedLines = lines |> List.ofSeq(或lines |> Array.ofSeq)。你想要一个列表还是一个数组将取决于:你想要一个单链表(F#list类型是一个链表),具有 O(1) 头访问和附加但 O(N) 随机访问,或者一个 O(1) 随机访问但追加速度慢的数组?
标签: f#