F#等效于C#运算符/符号“?”。

时间:2019-02-12 12:24:56

标签: f#

我有以下f#代码

product.code <- productPage.Html
    .Descendants["li"]
    .Select(fun node -> node.InnerText())
    .Where(fun link -> (Regex.Match(link,@"code:").Success))
    .FirstOrDefault()
    .Replace("code:", "")
    .Trim()

我在使用null时遇到了一些麻烦。 在C#中,我会做这样的事情。

product.code = productPage?.Html
    ?.Descendants["li"]
    ?.Select(node => node.InnerText())
    ?.Where(link => Regex.Match(link,@"code:").Success)
    ?.FirstOrDefault()
    ?.Replace("code:", "")
    ?.Trim() ?? "Not Found"

这可能吗?

1 个答案:

答案 0 :(得分:3)

在第二个示例中,对我来说它看起来像“?”。由于其最初的使用,必须贯穿整个呼叫链。我建议您不要使用更惯用的F#,而不要尝试重新创建此运算符并保​​留它在C#中的外观。例如:

module String =
    let replace (oldValue: string) (newValue: string) (s: string) =
        s.Replace (oldValue, newValue)

    let trim (s: string) =
        s.Trim()

let result =
    match isNull productPage with
    | true -> None
    | false ->
        productPage.Html.Descendants.["li"]
        |> Seq.map (fun node -> node.InnerText())
        |> Seq.tryPick (fun link -> (Regex.Match (link, "code:").Success))

let code =
    match result with
    | Some html -> 
        html
        |> String.replace "code:" ""
        |> String.trim
    | None -> "Not Found" 

product.code <- code