3

我不理解此代码段中 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 个键是相同的。我错了哪一部分?

4

2 回答 2

4

F# 不比较序列是否相等,请参阅此示例

(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]
于 2013-03-25T03:21:17.683 回答
2

Seq.sort可能没有实现比较逻辑。所以底层实现看到三个不同的对象。

如果您执行以下操作,则类似:

object.ReferenceEquals("1", 1.ToString());
于 2013-03-25T02:55:13.827 回答