如何在f#中将File.ReadAllLines的结果设置为ResizeArray或Array?

时间:2018-12-14 01:14:29

标签: f#

我有这个编:

1.3.10

File.ReadAllLines的类型是string [],如果我使用Array.zeroCreate,我必须确定一个初始数字,但是我没有使用File.ReadAllLines,所以我不知道数字。如果我使用ResizeArray,它的类型是ResizeArray,我无法将string []传递给它。

如何解决这个问题?谢谢!

3 个答案:

答案 0 :(得分:4)

无需声明或初始化可变数组。只需使用let将名称绑定到ReadAllLines的结果

if File.Exists(maincfPath) then
   let lines = File.ReadAllLines(maincfPath)
   ... // do something with lines
else
   Environment.Exit(0)

在处理错误时,我更喜欢以这种方式使用if then else,这样可以避免出现箭头图案:

 if File.Exists(maincfPath) |> not then Environment.Exit(0) else
 let lines = File.ReadAllLines(maincfPath)
 ... // do something with lines

答案 1 :(得分:2)

您可以只使用空数组[||],因为无论如何它将被File.ReadAllLines()创建的数组替换。

答案 2 :(得分:0)

如果可能的话,请避免使用ReadAllLines将所有行读入内存,这对您的内存不利,也是避免的好习惯。尝试改用File.ReadLines,因为它会返回seq<string>,并逐行读取到内存中,而不是一次全部读取。

for line in File.ReadLines(path) do
    … // do something with line

如果您不想在此枚举行,它仍然只是seq<string>(这是IEnumerable<string>的别名),因此您可以将其传递给可以处理{ {1}},就像seq模块一样,您将获得良好的负责任的内存管理,一次只消耗一行,而不是将整个文件加载到内存中,并且将一个巨大的字符串加载到LOH中。

回答您的问题,尽管您不应该这样做

Seq

就像给了reanyy一样,但是要再次避免尽可能将所有行都加载到内存中。