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