经过相当多的搜索后,我找不到与Enumerable.DefaultIfEmpty相当的F#。
F#中是否存在类似的东西(也许是以不同的,惯用的方式)?
答案 0 :(得分:6)
为了保持序列的懒惰,我们可以使用枚举器的状态。
let DefaultIfEmpty (l:'t seq) (d:'t) =
seq{
use en = l.GetEnumerator()
if en.MoveNext() then
yield en.Current
while en.MoveNext() do
yield en.Current
else
yield d }
答案 1 :(得分:4)
有几个选择:
DefaultIfEmpty
像这样写自己的:
let DefaultIfEmpty (l:'t seq) (d:'t) =
match Seq.length l with |0 -> seq [d] |_ -> l
担心无限序列
let DefaultIfEmpty (l:'t seq) (d:'t) =
match Seq.isEmpty l with |true -> seq [d] |false -> l
答案 2 :(得分:4)
Seq
模块函数运行并返回IEnumerable<_>
和DefaultIfEmpty
运行并返回IEnumerable<_>
。如何将它包装在可组合的函数中。
let inline DefaultIfEmpty d l = System.Linq.Enumerable.DefaultIfEmpty(l, d)
这也保留了懒惰。
示例:的
Seq.empty |> DefaultIfEmpty 0
<强>更新强>
我创建了一个开源库,内联了许多扩展和静态方法,包括Enumerable.defaultIfEmpty
- ComposableExtesions