【问题标题】:Pattern match guard with DateTime.TryParseExact?DateTime.TryParseExact 的模式匹配保护?
【发布时间】:2015-01-04 17:32:51
【问题描述】:

如何使用DateTime.TryParseExact 进行防护(并尽可能获取解析值)?以下代码不起作用。

[<EntryPoint>]
let main args =
    let argList = args |> List.ofSeq
    match argList with
    | "aaa" :: [] -> aaa.main "aaa"
    | "bbb" :: [] -> bbb.main "bbb"
    | "ccc" :: yyyymm :: [] when DateTime.TryParseExact
              (yyyymm, "yyyyMM", CultureInfo.InvariantCulture, DateTimeStyles.None)-> 
        ccc.main "ccc" yyyymm

【问题讨论】:

    标签: f# guard-clause


    【解决方案1】:

    您可以使用mutable

    let mutable dt = Unchecked.defaultof<_>
    match argList with
    | "ccc" :: yyyymm :: [] when 
        DateTime.TryParseExact(yyyymm, 
                               "yyyyMM", 
                               CultureInfo.InvariantCulture, 
                               DateTimeStyles.None, 
                               &dt) -> ...
    

    但活动模式使匹配更加清晰:

    let (|DateTimeExact|_|) (format: string) s =
        match DateTime.TryParseExact(s, format, CultureInfo.InvariantCulture, DateTimeStyles.None) with
        | true, d -> Some d
        | _ -> None
    
    match argList with
    | "ccc" :: DateTimeExact "yyyyMM" yyyymm :: [] -> ...
    

    【讨论】:

    • 太棒了。使用活动模式时如何获取列表第二项(yyyymm)的原始字符串值? yyyymm 的类型是 DateTime编辑:我可以更新DateTimeExact 以返回Some s 以获取原始字符串值。好奇获取解析前和解析后值的最佳方法是什么?
    • 您可以更改活动模式以返回两者:Some(s, d)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2020-05-21
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    相关资源
    最近更新 更多