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

时间:2018-06-13 02:31:05

标签: merge f# primary-key

我很好奇如何根据主键合并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)

2 个答案:

答案 0 :(得分:0)

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

这是您的起始数据,(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等。

答案 1 :(得分:0)

我可能会使用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)
}