Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Merge 如何基于主键将两个序列合并在一起?_Merge_F#_Primary Key - Fatal编程技术网

Merge 如何基于主键将两个序列合并在一起?

Merge 如何基于主键将两个序列合并在一起?,merge,f#,primary-key,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) 根据你的一些评论,这里有一种方法 这是您的起始数据,一个(int,string)元组列表 我们生成唯一密钥并建立联合: let keys1 = seq1 |&g

我很好奇一个人是如何基于主键在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)

根据你的一些评论,这里有一种方法

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

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

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")]
键3
|>Set.map(乐趣x->
设val1=map1.TryFind(x)
设val2=map2.TryFind(x)
(x,val1,val2)
)
//val it:设置=
//集合[(1,一些“5美元”,一些“是”);(2,一些“10美元”,一些“否”);
//(3,有些“5美元”,有些“是”)]
现在,您可以将此集合转换回列表或词典,删除非索引,等等。

我可能会用它来解决您的问题

鉴于此数据集:

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)
}

是的,我知道,我试着创造出列名的错觉,这样更容易阅读。修正了任何建议?关于如何解决此问题?您可以使用该键创建地图/字典,并添加每个序列中的值。取决于您的密钥最终是否唯一。是否有重复的ID?一个序列中是否有在另一个序列中跳过的ID?如果这两个问题的答案都是否定的,那么最简单的方法是对两个序列进行排序,然后使用将两个序列转换为使用两个序列中的值的单个序列。没有多个ID,但可能有不在一个序列中而是在另一个序列中的ID@rmunnI非常喜欢这个查询表达式,但是如果cashList有一个键怎么办,它不在carList中。这是一个可能性,看看最后的评论。
let result = query {
  for cash in cashList do
  join car in carList on (fst cash = fst car)
  select (fst cash, snd cash, snd car)
}