gpt4 book ai didi

linq - F# 中的 SingleOrDefault

转载 作者:行者123 更新时间:2023-12-05 08:40:49 27 4
gpt4 key购买 nike

类似于this问题 - 编写 LINQ 的 SingleOrDefault 最惯用的方法是什么?在 F# 中?

最佳答案

如果您希望函数在序列为空时返回null(或值类型的默认值),只需继续并调用现有的SingleOrDefault 方法即可。您可以很好地从 F# 调用 C# 方法。但是请记住,大多数 F# native 类型不允许空值,因此这可能并不总是可行的。

如果您希望您的函数返回一个选项类型,当序列包含零个或多个元素时返回到 None,您可以使用 Seq.truncate 来截断前两个元素:

let singleOrDefault s =
match s |> Seq.truncate 2 |> Seq.toList with
| [x] -> Some x
| _ -> None

或者类似地对于也采用谓词的重载:

let singleOrDefaultP pred s =
match s |> Seq.filter pred |> Seq.truncate 2 |> Seq.toList with
| [x] -> Some x
| _ -> None

如果您更喜欢同时使用两个版本,那么用一个版本来表达另一个版本可能是有意义的,以保持干燥:

let singleOrDefault s = singleOrDefaultP (fun _ -> true) s

与使用额外的 Seq.isEmpty 检查相比,此解决方案的优势在于序列仅被评估一次,并且仅在需要时评估。

顺便说一句,这正是the default implementation of SingleOrDefault

另请注意,当序列包含多个元素时,此解决方案将返回 None,而不是像原始解决方案那样抛出异常。这是在 F# 中处理错误的首选、惯用的方法。但是,如果您更喜欢原来的方式,可以通过在匹配中添加另一个案例来轻松实现:

let singleOrDefault s =
match s |> Seq.truncate 2 |> Seq.toList with
| [x] -> Some x
| [_;_] -> failWith "Too many" // replace with your favourite exception
| _ -> None

关于linq - F# 中的 SingleOrDefault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53303786/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com