如何根据主键将两个序列合并在一起?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何根据主键将两个序列合并在一起?相关的知识,希望对你有一定的参考价值。

我很好奇如何根据主键合并F#中的两个序列。我没有尝试任何东西,因为我不知道从哪里开始。

例:

原两套:

ID Cash
(1,$5)
(2,$10)
(3,$5)

ID Car
(1,Yes) 
(2,No)
(3,Yes)

结果:

ID Cash Car
(1,$5,Yes)
(2,$10,No)
(3,$5,Yes)
答案

我可能会使用query expressions来解决你的问题。

鉴于此数据集:

let cashList = [ (1, 5); (2, 10); (3, 5) ]
let carList = [ (1, "Yes"); (2, "No"); (3, "Yes") ]

以下查询应该可以解决问题:

let result = query {
  for cash in cashList do
  join car in carList on (fst cash = fst car)
  select (fst cash, snd cash, snd car)
}
另一答案

根据您的一些评论,这是一种方法。

这是您的起始数据,(int,string)元组的列表

let seq1 = [(1,"$5");(2,"$10");(3,"$5")]    
let seq2 = [(1,"Yes");(2,"No");(3,"Yes")]

我们生成唯一键并建立联合:

let keys1 = seq1 |> List.map fst |> Set.ofList 
let keys2 = seq2 |> List.map fst |> Set.ofList
let keys3 = keys1 + keys2 

我们还从两个序列中创建一个字典,以使查找更容易:

let map1 = Map.ofList seq1
let map2 = Map.ofList seq2

最后,我们遍历所有键,并从两个映射中提取相应的值。为了解释某些键可能丢失的事实,我使用了TryFind

keys3
    |> Set.map (fun x -> 
                let val1 = map1.TryFind(x)
                let val2 = map2.TryFind(x)
                (x,val1,val2)
    )

//val it : Set<int * string option * string option> =
//  set [(1, Some "$5", Some "Yes"); (2, Some "$10", Some "No");
//     (3, Some "$5", Some "Yes")]

现在你可以将这个集合转换回列表或字典,摆脱Nones等。

以上是关于如何根据主键将两个序列合并在一起?的主要内容,如果未能解决你的问题,请参考以下文章

SQL JOIN

SQL之join

实体框架代码优先 - 通过主键将子实体添加到父实体

基于主键将两个表从BigQuery导出到CSV

SQL的join使用

SQL Join 关键字