Linq where条件下的元组
考虑到F# 元组具有自动定义的相等操作 因此Linq where条件下的元组,linq,f#,equality,Linq,F#,Equality,考虑到F# 元组具有自动定义的相等操作 因此 let myQueryable = [| (1, 1); (2,2)|].AsQueryable() let check = query { for x in myQueryable do } |> Seq.where(fun x -> x = (2,2)) 是{(2,2)},那为什么 let check = query { for x in myQuery
let myQueryable = [| (1, 1); (2,2)|].AsQueryable()
let check =
query {
for x in myQueryable do
} |> Seq.where(fun x -> x = (2,2))
是{(2,2)}
,那为什么
let check =
query {
for x in myQueryable do
where(x = (2, 2))
}
是否为空
?您可能已经打开了System.Linq
在这两种情况下,以下为我返回(2,2)
:
//open System
//open System.Linq
let myQueryable = [| (1, 1); (2,2) |] //.AsQueryable()
let check =
query {
for x in myQueryable do
select x
} |> Seq.where(fun x -> x = (2,2))
check //val it : seq<int * int> = seq [(2, 2)]
let check' =
query {
for x in myQueryable do
where (x = (2, 2))
select x
}
check' //val it : seq<int * int> = seq [(2, 2)]
//开放系统
//开放系统
设myQueryable=[|(1,1);(2,2)|]/.AsQueryable()
让我查一查=
质疑{
对于myQueryable do中的x
选择x
}|>序列位置(乐趣x->x=(2,2))
检查//valit:seq=seq[(2,2)]
让我们检查一下=
质疑{
对于myQueryable do中的x
式中(x=(2,2))
选择x
}
选中“//valit:seq=seq[(2,2)]
因此,在
IQueryable
中,这种结构上的平等性并不成立。我不知道这是因为IQueryable类型,也就是说,它变成了引用相等,或者是重新定义了的,或者是一个可能的bug 这似乎是C#System.Tuple
和F#reference Tuple之间的兼容性问题
有趣的是,C#7和F#4.1之间的兼容性问题似乎得到了解决,新的ValueTuple
等价于F#结构元组
let myQueryableNew = [| ValueTuple.Create(1, 1); ValueTuple.Create(2,2) |].AsQueryable()
let resultFSharp1 =
query {
for x in myQueryableNew do
} |> Seq.where(fun x -> x = ValueTuple.Create(2,2))
let resultFSharp2 =
query {
for x in myQueryableNew do
where (x.Equals(ValueTuple.Create(2, 2)))
}
顺便说一句,还要注意新类型有一个更一致的默认值(在这种情况下)
是的,它是通过C#->F#互操作实现的:C#元组自动编译为F#元组,反之亦然
let testDefault =
query {
for x in myQueriable1 do
where (x.Equals(ValueTuple.Create(1, 2)))
select x
headOrDefault
}