0

F #은 = 연산자를 사용하고 Set과 같은 F # 컬렉션에서 2 차원 배열의 구조적 동일성을 지원합니다. 하지만 .NET 클래스 HashSet에서 동일한 평등 비교를 사용하려면 어떻게해야합니까? 기본적으로 참조 평등을 사용하며 IEqualityComparer<T>의 인스턴스를 사용하는 생성자가 있지만 2 차원 배열에 적합한 기본 제공 인스턴스를 찾을 수 없습니다.2 차원 배열에 대한 IEqualityComparer 인스턴스

나는 System.Collections.StructuralComparisons.StructuralEqualityComparer을 보았지만 두 가지 문제가있는 것으로 보입니다. 첫째, 제네릭하지 않고, 둘째, 두 개의 차원 배열을 지원하지 않는 것 : 그렇지, 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>[email protected]() 

을 :

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

나는 또한 Dictionary을 사용하는 솔루션에 만족 하겠지만 같은 문제가 적용된다고 생각합니다.

+1

중복 가능성 (http://stackoverflow.com/questions/12586814 [위한 IEqualityComparer (INT \ * INT) \ [\] 구조 비교를 수행? 만드는 방법]/intint-doing-structural-comparison을위한 howquerycomplete-ie-makequalitycomparer) – pad

답변

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 

Online demo

+0

고마워요. HashIdentity가하지 않았지만 HashSet이 .NET 코어에 들어간 것을 조금 즐겁습니다. (배열은 변경 가능하다는 점을 감안하면 더 안전 할지라도). –

관련 문제