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つのキーが同一であるため、1つの要素のみを期待していました。私が間違った部分はどれですか?

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おそらく比較ロジックを実装していません。したがって、基礎となる実装には3つの異なるオブジェクトがあります。

次の場合も同様です。

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