如何优雅地合并两个元组seq与指定的键?

fai*_*rjm 4 f#

我写了代码,但看起来很难看.
图像有两个seqs,如:

let x = [(1,"x");(2,"y")]
let y = [(1, "xx", "xxx");(2,"yy","yyy")]  
Run Code Online (Sandbox Code Playgroud)

元素是元组,但形状不同.
结果需要[(1, "x", "xx", "xxx");(2, "y", "yy", "yyy")].
元组中的第一个元素是这里的关键.

我写的代码使用的地图如下:

let x = [(1,"x");(2,"y")]
let y = [(1, "xx", "xxx");(2,"yy","yyy")]  
let mapY = y |> Seq.map (fun (a,b,c) -> (a, (b, c))) |> Map.ofSeq

let r = [
    for (k,v) in x do
        let (v1,v2) = mapY |> Map.tryFind k |> Option.orElse (Some ("","")) |> Option.get
        yield (k, v, v1, v2)
]

printfn "%A" r
Run Code Online (Sandbox Code Playgroud)

不那么优雅.
所以我想知道更好的解决方案吗?(问题中的元组元素可以是seq类型,例如元组).
关键问题是如何优雅地合并两个seq.

tor*_*nde 5

我建议使用query计算表达式(有关更多信息和示例,请参阅此处).在您的情况下,解决方案将如下所示:

let r =
    query {
        for (k1, v) in x do
        join (k2, v1, v2) in y on (k1 = k2)
        select(k1, v, v1, v2) }
    |> Seq.toList
Run Code Online (Sandbox Code Playgroud)

请注意,join此处使用的运算符实际上是内连接.链接到上面的页面上列出了许多其他连接方法(以及其他运算符).