【问题标题】:How to make an IEqualityComparer for (int*int) [] doing structural comparison?如何为 (int*int) [] 制作一个 IEqualityComparer 进行结构比较?
【发布时间】:2012-09-25 16:03:28
【问题描述】:

我想做一个hashset(int*int)[],所以如下

let mySet = new HashSet<_>()

因为我认为arraytuple 的默认比较器是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 对它们都是结构性的。

这有点奇怪,为什么?还有如何使用tuplearray 的默认结构比较为我的哈希集创建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


    【解决方案1】:

    我认为一个原因是 Array 是一种可变且与 .NET 兼容的类型。遵循 .NET 框架中默认的 参考比较 是有意义的。

    您可以将HashIdentity.Structural 作为参数传递。以下示例对数组和元组使用结构比较:

    let mySet = HashSet(HashIdentity.Structural)
    let a = [|(1, 2)|]
    let b = [|(1, 2)|]
    mySet.Add(a)
    mySet.Add(b)
    // val it : HashSet<(int * int) []> = seq [[|(1, 2)|]]
    

    【讨论】:

      【解决方案2】:

      查看DictionaryHashSet 类的文档。

      哈希集

      初始化 HashSet 类的新实例,该实例为空并使用集合类型的默认相等比较器。

      字典

      根据默认的相等比较器,字典中的每个键都必须是唯一的。 字典需要一个相等的实现来确定键是否相等。此构造函数使用默认的泛型相等比较器 EqualityComparer.Default。如果类型 TKey 实现 System.IEquatable 泛型接口,则默认相等比较器使用该实现。或者,您可以使用接受比较器参数的构造函数来指定 IEqualityComparer 通用接口的实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-18
        • 1970-01-01
        • 1970-01-01
        • 2013-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多