F#类型转换字符串数组

时间:2016-10-12 08:36:02

标签: arrays string casting f#

我有2个数组。数组1是一个包含类型名称的字符串数组。

所以Array 1的内容如下所示:

["nvarchar";"nvarchar";"date";"nvarchar"] //these are all strings

数组2是另一个字符串数组,内容如下所示:

["Jackson";"Sentzke";"1991-04-19T00:00:00";"Jackson Sentske"]

我的问题是数组2中的所有值都是字符串,我希望它们是数组1中的类型。有没有办法可以使用数组1中的字符串在数组2中输入字符串?

3 个答案:

答案 0 :(得分:6)

正如@ s952163指出的那样,您似乎正在尝试从数据库中读取数据,在这种情况下有更好的选项而不是自己尝试。尽管如此,只是为了勾画出一个可能的解决方案,如果以面值来看OP,这是一种方法。

由于列出的类型不是.NET类型,因此定义一个自定义类型来保存这些值可能更好:

open System

type DbType = NVarChar of string | DT of DateTime

如果您愿意,可以向DbType添加更多个案。

使用active patterns,您可以编写一个函数来转换单个候选者:

// string * string -> string option
let (|NVarChar|_|) = function
    | "nvarchar", (x : string) -> Some x
    | _ -> None

// string * string -> DateTime option
let (|DT|_|) (typeHint, value) =
    match (typeHint, DateTime.TryParse value) with
    | "date", (true, dt) -> Some dt
    | _ -> None

// string * string -> DbType option    
let convertPair = function
    | NVarChar x -> Some (NVarChar x)
    | DT x -> Some (DT x)
    | _ -> None

使用活动模式并非严格必要,但我认为这使我能够以一种好的方式分解问题。

现在您可以声明一个类型列表和一个值,将它们压缩在一起以获得解释值列表:

> let types = ["nvarchar"; "nvarchar"; "date"; "nvarchar"];;    
val types : string list = ["nvarchar"; "nvarchar"; "date"; "nvarchar"]

> let values = ["Jackson"; "Sentzke"; "1991-04-19T00:00:00"; "Jackson Sentske"];;    
val values : string list =
  ["Jackson"; "Sentzke"; "1991-04-19T00:00:00"; "Jackson Sentske"]

> let converted = List.zip types values |> List.choose convertPair;;    
val converted : DbType list =
  [NVarChar "Jackson"; NVarChar "Sentzke"; DT 19.04.1991 00:00:00;
   NVarChar "Jackson Sentske"]

请注意,typesvalues都有string list类型。在OP中,它们是(string * string * string * string) list,我认为这是一个错误。

答案 1 :(得分:5)

其实这里有一些问题。

逗号创建元组 你的代码

["nvarchar","nvarchar","date","nvarchar"]

不是string list,而是(string * string * string * string) list

如果您想创建string list,则必须使用分号;

现在,如果你知道你的代码总是具有你想要的确切类型的元组元素的确切数量,那么你可以像这样做

type RowItems = string * string * DateTime * string
type Rows = RowItem list

现在,如果您的问题包含不同大小的行,并且您希望从SQL数据类型转换为SQL数据类型,那么使用判别联合的方法可能会有所帮助。

type SQLDataType =
   | VarChar of string
   | Date of DateTime

type Row = SQLDataType list
type Rows = RowItem list

然后使用就像这样

let row = 
    [
        VarChar "Jackson";
        VarChar "Sentzke";
        Date DateTime.parse("1991-04-19T00:00:00");
        VarChar "Jackson Sentske"
    ]

最后你应该编写一些转换函数,将函数转换为SQL数据

let fromSQL (s:string) : SQLDataType = ...
let toSQL (s:SQLDataType) : string = ...

我希望这会有所帮助。

答案 2 :(得分:0)

这是一个低级别的解决方案,因为它并不是很明显,但是如果所有这些都是你的字符串属于db类型,那么T-SQL我有Cast and Convertthis。所以你可以说CAST ("1991-04-19T00:00:00" AS date)