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)
从 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)
您可以通过以下方式使用模式匹配:
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)
但是你必须决定如果列表有奇数个元素该怎么办(在我的解决方案中生成了一对具有相同值的元素)