如何在F#中遍历String [] []

bug*_*net 1 f# visual-studio-2015

上下文:Microsoft Visual Studio 2015社区; F#

我一直在学习F#约半天.我有一个如何做函数式编程,从花了一年时间乱搞一个模糊的概念mLite.

以下脚本遍历文件夹树并提取日志文件.文件具有分隔的条目,~并且可能存在一个或多个.

open System
open System.IO

let files = 
    System.IO.Directory.GetFiles("C:\\scratch\\snapshots\\", "*.log", SearchOption.AllDirectories)

let readFile (file: string) = 
    //Console.WriteLine(file)
    let text = File.ReadAllText(file) 
    text

let dataLines (line: string) = 
    line.Split('~')

let data = 
    files |> Array.map readFile |> Array.map dataLines
Run Code Online (Sandbox Code Playgroud)

所以在这一点data包含一个String[][],我有点不知道如何把它变成一个String[],这个想法是我想把所有的日志转换成一个长向量,这样我就可以做一些其他的转换它.例如,每个日志行都以日期时间开始,因此将其全部转换为一个长列表,然后我可以对日期时间进行排序.

从哪里来?

Gus*_*Gus 6

如评论中所述,您可以使用Array.concat:

files |> Array.map readFile |> Array.map dataLines |> Array.concat
Run Code Online (Sandbox Code Playgroud)

现在进行一些重构,两个映射的组合相当于两个函数组成的映射.

files |> Array.map (readFile >> dataLines) |> Array.concat
Run Code Online (Sandbox Code Playgroud)

最后map >> concat相当于collect.所以你的代码变成:

files |> Array.collect (readFile >> dataLines)
Run Code Online (Sandbox Code Playgroud)