元组在哪里条件

时间:2017-11-01 10:50:09

标签: 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 myQueryable do
            where(x = (2, 2))
            }

Empty

2 个答案:

答案 0 :(得分:1)

这似乎是C#System.Tuple和F#参考元组之间的兼容性问题。

有趣的是,兼容性问题似乎在C#7和F#4.1之间解决,新的ValueTuple等同于F#struct元组。

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

顺便说一下,还要注意新类型的默认值更为一致(如果这是相关的issue

let testDefault =
        query {
            for x in myQueriable1 do
            where (x.Equals(ValueTuple.Create(1, 2))) 
            select x
            headOrDefault
            }

答案 1 :(得分:0)

您可能已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)] 

所以在IQueryable范围内,这种结构性平等并不成立。我不知道它是否因为IQueryable类型,即它成为引用相等,或者where被重新定义,或者是一个可能的错误。