F# 支持二维数组与=
运算符的结构相等性,以及在 F# 集合(如Set
. 但是如何在 .NET 类中使用相同的相等比较HashSet
呢?默认情况下,它使用引用相等,尽管有一个构造函数采用IEqualityComparer<T>
I 的实例,但无法找到适合二维数组的内置实例。
我看了看System.Collections.StructuralComparisons.StructuralEqualityComparer
,但这似乎有两个问题。首先,它不是通用的,其次,它似乎不支持二维数组:
> let xss = Array2D.create 2 2 99;;
> let yss = Array2D.create 2 2 99;;
// `=` operator does what I want
> xss = yss;;
val it : bool = true
// pre-defined StructuralEqualityComparer object doesn't work
> open System.Collections;;
> let comp = StructuralComparisons.StructuralEqualityComparer;;
val comp : IEqualityComparer
> (xss :> IStructuralEquatable).Equals(yss, comp);;
System.ArgumentException: Array was not a one-dimensional array.
at System.Array.GetValue(Int32 index)
at System.Array.System.Collections.IStructuralEquatable.Equals(Object other, IEqualityComparer comparer)
at <StartupCode$FSI_0023>.$FSI_0023.main@()
最终,我想修复以下代码,使其返回 1,而不是 2:
> let hashset = new Generic.HashSet<int[,]>();;
> hashset.Add xss;;
> hashset.Add yss;;
> hashset.Count;;
val it : int = 2
我也会对使用 的解决方案感到满意Dictionary
,但我认为同样的问题也适用。