【发布时间】:2012-09-25 16:03:28
【问题描述】:
我想做一个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]]
我们可以看到 array 的默认 IEqualityComparer 不是 HashIdentity.Structural,但 list 是。然而,默认的IComparer 对它们都是结构性的。
这有点奇怪,为什么?还有如何使用tuple 和array 的默认结构比较为我的哈希集创建IEqualityComparer。
我知道如何在 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)
【问题讨论】:
标签: .net f# comparison