gpt4 book ai didi

f# - 使用 leftOuterJoin,不需要 .DefaultIfEmpty()

转载 作者:行者123 更新时间:2023-12-01 00:57:53 25 4
gpt4 key购买 nike

leftOuterJoin 的文档Query Expressions on MSDN通过样本反复暗示使用 leftOuterJoin .. on .. into .. 时您仍然必须使用 .DefaultIfEmpty()以达到预期的效果。

我不认为这是必要的,因为我在这两个测试中得到了相同的结果,不同之处仅在于第二个测试没有 .DefaultIfEpmty()

type Test = A | B | C
let G = [| A; B; C|]
let H = [| A; C; C|]

printfn "%A" <| query {
for g in G do
leftOuterJoin h in H on (g = h) into I
for i in I.DefaultIfEmpty() do
select (g, i)}

printfn "%A" <| query {
for g in G do
leftOuterJoin h in H on (g = h) into I
for i in I do
select (g, i)}

// seq [(A, A); (B, null); (C, C); (C, C)]
// seq [(A, A); (B, null); (C, C); (C, C)]

1)你能确认一下吗?

如果这是对的,我是在编写这个替代类型增强以试图更好地处理无与伦比的结果之后才意识到的,我很惊讶仍然看到 null在我的输出中!
type IEnumerable<'TSource> with
member this.NoneIfEmpty = if (Seq.exists (fun _ -> true) this)
then Seq.map (fun e -> Some e) this
else seq [ None ]

printfn "%A" <| query {
for g in G do
leftOuterJoin h in H on (g = h) into I
for i in I.NoneIfEmpty do
select (g, i)}

// seq [(A, Some A); (B, Some null); (C, Some C); (C, Some C)]

2) 有没有办法获得 None而不是 null/ Some null来自 leftOuterJoin ?

3)我真正想做的是找出是否有任何不匹配的 g
printfn "%A" <| query {
for g in G do
leftOuterJoin h in H on (g = h) into I
for i in I.NoneIfEmpty do
where (i.IsNone)
exists (true) }

我想出了下一个,但它不是很 F#:
printfn "%A" <| query {
for g in G do
leftOuterJoin h in H on (g = h) into I
for i in I do
where (box i = null)
exists (true)}

最佳答案

简短版本:查询表达式使用空值。这是语言中的一个粗糙的地方,但一个可以包含的地方。

我以前做过这个:

let ToOption (a:'a) =
match obj.ReferenceEquals(a,null) with
| true -> None
| false -> Some(a)

这会让你做:
printfn "%A" <| query {
for g in G do
leftOuterJoin h in H on (g = h) into I
for i in I do
select ( g,(ToOption i))}

它将每个结果包装在一个选项中(因为你不知道是否会有一个 I。值得注意的是,F# 在运行时使用 null 来表示 None 作为优化。所以要检查这是否确实是你想要什么,就选项做出决定,例如:
Seq.iter (fun (g,h) -> 
printf "%A," g;
match h with
| Some(h) -> printfn "Some (%A)" h
| None -> printfn "None")
<| query {
for g in G do
leftOuterJoin h in H on (g = h) into I
for i in I do
select ((ToOption g),(ToOption i))}

关于f# - 使用 leftOuterJoin,不需要 .DefaultIfEmpty(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26008069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com