使用System.IO.File.ReadAllText实现.txt文件列表内容倒序拼接输出
问题分析
你当前的代码存在两处核心问题,导致无法实现倒序需求:
- 递归逻辑中每次匹配都调用
helpLst.rev,相当于每次递归都会反转一次剩余列表,逻辑存在错误 - 仅实现了文件列表的倒序拼接,没有对读取到的文件内容本身做倒序处理
实现方案
你可以根据实际需求选择对应实现:
字符串级倒序(所有字符整体倒序)
如果需要把文件内容的每个字符按顺序完全反转,先实现字符串反转工具方法:将字符串转为字符数组后反转,再重新拼接为字符串即可。
方案1:先倒序文件列表,再对每个文件内容单独倒序拼接
最终输出顺序为:最后一个文件的倒序内容 + 倒数第二个文件的倒序内容 + ... + 第一个文件的倒序内容
let tac (filenames : string list) : string option = // 字符串字符倒序方法 let reverseStr (s: string) = s.ToCharArray() |> Array.rev |> System.String let rec help (remainingFiles : string list) (acc : string) : string option = match remainingFiles with | [] -> Some acc | head :: tail -> match readFile head with | None -> None | Some content -> help tail (acc + reverseStr content) // 入口处统一反转文件列表,避免递归中重复反转 help (List.rev filenames) ""
方案2:先按原顺序拼接所有文件内容,再对整体内容倒序
最终输出是所有文件按原顺序拼接完成后,整体反转字符顺序的结果
let tac (filenames : string list) : string option = let reverseStr (s: string) = s.ToCharArray() |> Array.rev |> System.String let rec help (remainingFiles : string list) (acc : string) : string option = match remainingFiles with | [] -> Some (reverseStr acc) | head :: tail -> match readFile head with | None -> None | Some content -> help tail (acc + content) help filenames ""
行级倒序(类似Unix tac命令效果)
如果需要每行内容本身不变,仅反转行的排列顺序,可以替换反转方法为按行拆分后反转:
// 按行倒序方法 let reverseLines (s: string) = s.Split('\n') |> Array.rev |> String.concat "\n"
把上面两个方案中的reverseStr替换为reverseLines即可实现对应效果。
内容的提问来源于stack exchange,提问作者Stadsbjerg
相关产品推荐
相关产品推荐

