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
을 사용하는 솔루션에 만족 하겠지만 같은 문제가 적용된다고 생각합니다.
중복 가능성 (http://stackoverflow.com/questions/12586814 [위한 IEqualityComparer (INT \ * INT) \ [\] 구조 비교를 수행? 만드는 방법]/intint-doing-structural-comparison을위한 howquerycomplete-ie-makequalitycomparer) – pad