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

时间:2014-02-04 08:50:45

标签: linq f#

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

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

3 个答案:

答案 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)

有几个选择:

  1. 使用可能非惯用但可以正常使用的DefaultIfEmpty
  2. 像这样写自己的:

    let DefaultIfEmpty (l:'t seq) (d:'t) = 
        match Seq.length l with |0 -> seq [d] |_ -> l
    
  3. 担心无限序列

    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