加载具有固定数据模式的数组

Sim*_*ods 3 arrays f#

我有一个分隔的数据字符串,例如

a~b~c~d~e~f~g~h~i~j~k~l~... 
dog~cat~fish~parrot~mother~father~child~grandparent~...
hello~hi~greetings~yo
Run Code Online (Sandbox Code Playgroud)

我想将数据加载到数组/ seq类型的记录中

type myType {
    first: string;
    second: string;
    third: string;
    fourth:string;
}
Run Code Online (Sandbox Code Playgroud)

所以我最终得到了数组/ seq中的3个对象.我一直在乱用for循环来做这件事,但感觉非常迫切.如何使用功能成语来实现这一目标?

编辑:我应该澄清的是,分隔的数据可能是可变长度的,尽管分隔的项目数应始终是4所以倍数,每次迭代中,我期待窄条4个输入数据的其加载到输入类型,一旦消耗完所有数据,返回一个Array/seq.

编辑2:所以我最终得到了这样的东西

let createValues(data: string) =               
    let splitValues(valueString) = 
        let rec splitData acc = function
            | a :: b :: c :: d :: xs -> splitData ({ first=a; second=b; third=c; fourth=d } :: acc) xs
            | [] -> acc
            | _ -> failwith "uneven data"
        splitData [] valueString
    splitValues (data.Split [|'~'|] |> Array.toList)
Run Code Online (Sandbox Code Playgroud)

谢谢

Ros*_*lay 5

您的类型只包含单个字符 - 假设数据始终由单个字符组成,则不需要分隔符.下面是将数据映射到类型列表的一种方法,这只有在数据中的字符数可以被4整除时才有效,但是可以使用可变大小的输入.

let data = "a~b~c~d~e~f~g~h~i~j~k~l~m~n~o~p"

let splitData data =
    let rec aux acc = function
        | a::b::c::d::xs -> aux ({ first=a; second=b; third=c; fourth=d } :: acc) xs
        | [] -> acc
        | _ -> failwith "uneven data"
    aux [] data

let output = splitData (data.Replace("~","").ToCharArray() |> Array.toList)
Run Code Online (Sandbox Code Playgroud)