0

=F# は、演算子を使用した 2 次元配列の構造上の等価性をサポートしており、 Set. しかし、.NET クラスで同じ等価比較を使用するにはどうすればよいHashSetでしょうか? デフォルトでは、参照等価性が使用されます。インスタンスを取るコンストラクターがありますがIEqualityComparer<T>、2 次元配列に適した組み込みインスタンスが見つかりません。

を見ましたSystem.Collections.StructuralComparisons.StructuralEqualityComparerが、2 つの問題があるようです。第一に、それは一般的ではなく、第二に、2 次元配列をサポートしていないようです:

> 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@()

最終的には、2 ではなく 1 を返すように次のコードを修正したいと思います。

> let hashset = new Generic.HashSet<int[,]>();;
> hashset.Add xss;;
> hashset.Add yss;;
> hashset.Count;;
val it : int = 2

を使用したソリューションにも満足していDictionaryますが、同じ問題が当てはまると思います。

4

1 に答える 1

2
let a = Array2D.create 2 2 99
let b = Array2D.create 2 2 99
let set = System.Collections.Generic.HashSet(HashIdentity.Structural)
set.Add a
set.Add b
printfn "%A" set.Count // 1

オンラインデモ

于 2012-10-31T00:25:24.803 に答える