是否存在与Enumerable.DefaultIfEmpty相当的F#?

Nik*_*nis 4 linq f#

经过相当多的搜索,我找不到与Enumerable.DefaultIfEmpty相当的F#.

F#中是否存在类似的东西(也许是以不同的,惯用的方式)?

kae*_*fer 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 }
Run Code Online (Sandbox Code Playgroud)

  • 我很确定`use`需要在`seq {}`块中 - 否则枚举器会被急切地创建并且过早处理掉. (2认同)
  • 谢谢您的回答!提供的代码有效.但是,由于Stack Overflow允许我只选择1个正确的答案,我必须选择我最终使用的答案.再一次,谢谢你的回答! (2认同)

jbt*_*ule 4

Seq模块函数操作和返回IEnumerable<_>以及DefaultIfEmpty操作和返回IEnumerable<_>。将其包装在可组合的函数中怎么样?

let inline DefaultIfEmpty d l = System.Linq.Enumerable.DefaultIfEmpty(l, d)
Run Code Online (Sandbox Code Playgroud)

这也保留了懒惰。

例子:

Seq.empty |> DefaultIfEmpty 0
Run Code Online (Sandbox Code Playgroud)

更新

我制作了一个内联许多扩展和静态方法的开源库,包括Enumerable.defaultIfEmpty-- ComposableExtesions

  • 鉴于这只是一个包装器,我认为将其标记为内联是明智的。 (2认同)