我有一个分隔的数据字符串,例如
a~b~c~d~e~f~g~h~i~j~k~l~...
dog~cat~fish~parrot~mother~father~child~grandparent~...
hello~hi~greetings~yo
我想将数据加载到类型记录的数组/序列中
type myType {
first: string;
second: string;
third: string;
fourth:string;
}
所以我最终会在数组/序列中得到 3 个对象。我一直在搞弄 for 循环来做到这一点,但感觉非常必要。我将如何使用功能习语来实现这一目标?
编辑:我应该澄清分隔数据可能是可变长度的,尽管分隔项目的数量应该始终是 4 的倍数。因此,每次迭代时,我都希望剥离 4 条输入数据,将它们加载到类型,一旦所有数据都被消耗掉,返回一个数组/序列。
编辑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)
谢谢
最佳答案
您的类型仅包含单个字符 - 假设数据始终由单个字符组成,则分隔符是不必要的。这是将数据映射到您的类型列表的一种方法,这仅适用于数据中的字符数可被 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)
关于arrays - 加载具有固定数据模式的数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15707676/