hashset
のを作りたい(int*int)[]
ので、次のように
let mySet = new HashSet<_>()
array
とのデフォルトの比較子だと思ったので、それtuple
はHashIdentity.Structural
私のニーズを自動的に満たします。
ただし、機能しません。これが私の実験です:
let mySet = new HashSet<_>()
let a = [|1;2|]
let b = [|1;2|]
let c = compare a b
mySet.Add(a)
mySet.Add(b)
val a : int [] = [|1; 2|]
val b : int [] = [|1; 2|]
val c : int = 0
val it : HashSet<int []> = seq [[|1; 2|]; [|1; 2|]]
let mySet = new HashSet<_>()
let a = [1;2]
let b = [1;2]
let c = compare a b
mySet.Add(a)
mySet.Add(b)
val a : int list = [1; 2]
val b : int list = [1; 2]
val c : int = 0
val it : HashSet<int list> = seq [[1; 2]]
ご覧のとおり、配列のデフォルトIEqualityComparer
はではありませんHashIdentity.Structural
が、リストはです。ただし、デフォルトIComparer
は両方の構造です。
それは少し奇妙です、なぜですか?また、IEqualityComparer
とのデフォルトの構造比較を使用してハッシュセットtuple
のを作成する方法array
。
C#で手動で行う方法は知っていますが、F#を学び始めたばかりなので、誰か助けてもらえますか?
次のコードは私の努力です:
let a = [|(1,2);(2,3)|]
let b = [|(1,2);(2,3)|]
type MyEqualityComparer() =
interface IEqualityComparer<(int*int)[]> with
member this.Equals (a,b) = (Array.forall2 (=) a b)
member this.GetHashCode (a) = hash (a |> Array.map hash)