我不明白此片段中distinctBy的行为:
let s = [123; 231; 321]
let s1 = s |> Seq.map (string >> Seq.sort)
let s2 = s |> Seq.distinctBy (string >> Seq.sort)
产生:
s1 = seq [seq ['1'; '2'; '3']; seq ['1'; '2'; '3']; seq ['1'; '2'; '3']]
正如所料,但是:
s2 = seq [123; 231; 321]
我只期望一个元素,因为3个键是相同的。哪一部分我错了?
答案 0 :(得分:4)
F#不比较Sequences的相等性,请参阅此示例
(123 |> string |> Seq.sort) = (123 |> string |> Seq.sort)
val it : bool = false
我想这是为了支持无限序列。
您可以通过映射到列表
来解决此问题let s = [123; 231; 321] |> Seq.distinctBy (string >> Seq.sort >> Seq.toList);;
val s : seq<int>
> s;;
val it : seq<int> = seq [123]
答案 1 :(得分:2)
Seq.sort
可能没有实现比较逻辑。因此,底层实现会看到三个不同的对象。
如果您执行以下操作,则类似:
object.ReferenceEquals("1", 1.ToString());