在 f# 中加入基于相同标签的 2 个记录列表
Join 2 list of recoreds based on same label in f#
我有 2 个具有相同标签的记录列表 id1
。我需要一种加入他们的方式。
type A = { id1: int; name: string }
type B = { id1: int; id2: Option<int> }
let a1 = { id1 = 1; name = "nafis" }
let a2 = { id1 = 2; name = "habib" }
let b1 = { id1 = 1; id2 = Some(5) }
let b2 = { id1 = 1; id2 = None }
let b3 = { id1 = 2; id2 = None }
let a = [a1; a2]
let b = [b1; b2; b3]
printfn "%A" a => [({id1 = 1;name = "nafis";}, {id1 = 2;name = "habib";})]
printfn "%A" b =>
[({id1 = 1; id2 = Some 5;}, {id1 = 1; id2 = None;}, {id1 = 2;id2 = None;})]
如何加入这两个基于id1
的列表?
我想要这样的输出=>
[({id1 = 1;name = "nafis"; id2 = [Some 5; None];}, {id1 = 2;name = "habib"; id2 =[None];})]
某种形式的教程或博客 link 会有所帮助。
MSDN: Query expressions enable you to query a data source and put the data in a desired form. Query expressions provide support for LINQ in F#.
正如评论中正确提到的那样,您需要有第三个类型 C 来承载连接结果,然后使用良好的旧 LINQ 来连接列表:
type A = { id1: int; name: string }
type B = { id1: int; id2: Option<int> }
type C = { id1: int; name: string; id2: Option<int> }
let a1 = { id1 = 1; name = "nafis" }
let a2 = { id1 = 2; name = "habib" }
let b1 = { id1 = 1; id2 = Some(5) }
let b2 = { id1 = 1; id2 = None }
let b3 = { id1 = 2; id2 = None }
let a = [a1; a2]
let b = [b1; b2; b3]
let result (a:A list) (b: B list) = query {
for list1 in a do
join list2 in b on
(list1.id1 = list2.id1)
select {id1 = list1.id1; name = list1.name; id2= list2.id2}
}
let c = result a b |> List.ofSeq
结果:
val c : C list = [{id1 = 1;
name = "nafis";
id2 = Some 5;}; {id1 = 1;
name = "nafis";
id2 = None;}; {id1 = 2;
name = "habib";
id2 = None;}]
我有 2 个具有相同标签的记录列表 id1
。我需要一种加入他们的方式。
type A = { id1: int; name: string }
type B = { id1: int; id2: Option<int> }
let a1 = { id1 = 1; name = "nafis" }
let a2 = { id1 = 2; name = "habib" }
let b1 = { id1 = 1; id2 = Some(5) }
let b2 = { id1 = 1; id2 = None }
let b3 = { id1 = 2; id2 = None }
let a = [a1; a2]
let b = [b1; b2; b3]
printfn "%A" a => [({id1 = 1;name = "nafis";}, {id1 = 2;name = "habib";})]
printfn "%A" b =>
[({id1 = 1; id2 = Some 5;}, {id1 = 1; id2 = None;}, {id1 = 2;id2 = None;})]
如何加入这两个基于id1
的列表?
我想要这样的输出=>
[({id1 = 1;name = "nafis"; id2 = [Some 5; None];}, {id1 = 2;name = "habib"; id2 =[None];})]
某种形式的教程或博客 link 会有所帮助。
MSDN: Query expressions enable you to query a data source and put the data in a desired form. Query expressions provide support for LINQ in F#.
正如评论中正确提到的那样,您需要有第三个类型 C 来承载连接结果,然后使用良好的旧 LINQ 来连接列表:
type A = { id1: int; name: string }
type B = { id1: int; id2: Option<int> }
type C = { id1: int; name: string; id2: Option<int> }
let a1 = { id1 = 1; name = "nafis" }
let a2 = { id1 = 2; name = "habib" }
let b1 = { id1 = 1; id2 = Some(5) }
let b2 = { id1 = 1; id2 = None }
let b3 = { id1 = 2; id2 = None }
let a = [a1; a2]
let b = [b1; b2; b3]
let result (a:A list) (b: B list) = query {
for list1 in a do
join list2 in b on
(list1.id1 = list2.id1)
select {id1 = list1.id1; name = list1.name; id2= list2.id2}
}
let c = result a b |> List.ofSeq
结果:
val c : C list = [{id1 = 1;
name = "nafis";
id2 = Some 5;}; {id1 = 1;
name = "nafis";
id2 = None;}; {id1 = 2;
name = "habib";
id2 = None;}]