我有以下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"
这可能吗?
答案 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