如何从F#Seq获取连续值对

fun*_*nal 7 f# sequence

我有一个序列{"1";"a";"2";"b";"3";"c";...}.

如何将此seq转换为 {("1","a");("2","b");("3","c");...}

Bri*_*ian 17

这是一个非常聪明的解决方案:

let s = ["1";"a";"2";"b";"3";"c"]

let pairs s =
    s |> Seq.pairwise 
      |> Seq.mapi (fun i x -> i%2=0, x) 
      |> Seq.filter fst 
      |> Seq.map snd

printfn "%A" (pairs s)
Run Code Online (Sandbox Code Playgroud)


gra*_*bot 10

调查员并不总是邪恶的.

let pairs (source: seq<_>) =
    seq { 
        use iter = source.GetEnumerator() 
        while iter.MoveNext() do
            let first = iter.Current
            if iter.MoveNext() then
                let second = iter.Current 
                yield (first, second)
    }
Run Code Online (Sandbox Code Playgroud)

这是Seq.pairwise从中获取的F#源代码FSharp.Core/seq.fs

[<CompiledName("Pairwise")>]
let pairwise (source: seq<'T>) = //'
    checkNonNull "source" source
    seq { use ie = source.GetEnumerator() 
          if ie.MoveNext() then
              let iref = ref ie.Current
              while ie.MoveNext() do
                  let j = ie.Current 
                  yield (!iref, j)
                  iref := j }
Run Code Online (Sandbox Code Playgroud)


Pat*_*ald 7

从 F# 4.0 开始,您现在可以使用 chunkBySize

let source = seq ["1";"a";"2";"b";"3";"c"]

let pairs source =
    source
    |> Seq.chunkBySize 2
    |> Seq.map (fun a -> a.[0], a.[1])

;;
printfn "%A" (pairs source)
Run Code Online (Sandbox Code Playgroud)


Jac*_*ack 0

您可以通过以下方式使用模式匹配:

let list = ["1";"2";"3";"4";"5";"6"]

let rec convert l =
    match l with
        x :: y :: z -> (x,y) :: convert z
        | x :: z -> (x,x) :: convert z
        | [] -> []

let _ = 
  convert list
Run Code Online (Sandbox Code Playgroud)

但是你必须决定如果列表有奇数个元素该怎么办(在我的解决方案中生成了一对具有相同值的元素)