Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dictionary 二维阵列的IEqualityComparer实例_Dictionary_F#_Hashset_Iequalitycomparer_Structural Equality - Fatal编程技术网

Dictionary 二维阵列的IEqualityComparer实例

Dictionary 二维阵列的IEqualityComparer实例,dictionary,f#,hashset,iequalitycomparer,structural-equality,Dictionary,F#,Hashset,Iequalitycomparer,Structural Equality,F#支持使用=运算符和在F#集合(如集合)中实现二维数组的结构相等。但是如何在.NET类HashSet中使用相同的相等比较呢?默认情况下,它使用引用相等,尽管有一个构造函数接受IEqualityComparer的实例,但我找不到适合二维数组的内置实例 我查看了System.Collections.structuralCompares.StructuralEqualityComparer,但这似乎有两个问题。首先,它不是通用的,其次,它似乎不支持二维数组: > let xss = Array

F#支持使用
=
运算符和在F#集合(如
集合
)中实现二维数组的结构相等。但是如何在.NET类
HashSet
中使用相同的相等比较呢?默认情况下,它使用引用相等,尽管有一个构造函数接受
IEqualityComparer
的实例,但我找不到适合二维数组的内置实例

我查看了
System.Collections.structuralCompares.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@()
>让xss=Array2D.create 2 99;;
>让yss=Array2D.create 2 99;;
//`=`操作员做我想做的事
>xss=yss;;
val it:bool=true
//预定义的StructureEqualityComparer对象不起作用
>开放系统。收藏;;
>设comp=structuralcompares.StructuralEqualityComparer;;
val公司:IEqualityComparer
>(xss:>IsstructuraleQuatable).等于(yss,comp);;
System.ArgumentException:数组不是一维数组。
位于System.Array.GetValue(Int32索引)
位于System.Array.System.Collections.IsStructuralEquatable.Equals(对象其他,IEqualityComparer比较器)
地址:$FSI_0023.main@()
最后,我希望修复以下代码,使其返回1,而不是2:

> let hashset = new Generic.HashSet<int[,]>();;
> hashset.Add xss;;
> hashset.Add yss;;
> hashset.Count;;
val it : int = 2
>让hashset=new-Generic.hashset();;
>添加xss;;
>hashset.addyss;;
>hashset.Count;;
val it:int=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

感谢信的可能副本。我有点觉得好笑的是,HashSet进入了.NETCore,而HashIdentity没有(尽管考虑到数组是可变的,这样可能更安全)。