col*_*ang 3 .net comparison f#
我要打hashset的(int*int)[],所以如下
let mySet = new HashSet<_>()
Run Code Online (Sandbox Code Playgroud)
因为我想为默认的比较array,并tuple是HashIdentity.Structural,它会自动满足我的需求.
但它不起作用.这是我的实验:
let mySet = new HashSet<_>()
let a = [|1;2|]
let b = [|1;2|]
let c = compare a b
mySet.Add(a)
mySet.Add(b)
val a : int [] = [|1; 2|]
val b : int [] = [|1; 2|]
val c : int = 0
val it : HashSet<int []> = seq [[|1; 2|]; [|1; 2|]]
let mySet = new HashSet<_>()
let a = [1;2]
let b = [1;2]
let c = compare a b
mySet.Add(a)
mySet.Add(b)
val a : int list = [1; 2]
val b : int list = [1; 2]
val c : int = 0
val it : HashSet<int list> = seq [[1; 2]]
Run Code Online (Sandbox Code Playgroud)
正如我们可以看到默认IEqualityComparer的阵列是不是HashIdentity.Structural,但名单是.但是,默认值IComparer是两者的结构.
这有点奇怪,有什么理由吗?此外,如何使IEqualityComparer使用的默认结构比较对我的HashSet tuple和array.
我知道如何在C#中手动完成,但由于我刚开始学习F#,有人可以帮忙吗?
以下代码是我的努力:
let a = [|(1,2);(2,3)|]
let b = [|(1,2);(2,3)|]
type MyEqualityComparer() =
interface IEqualityComparer<(int*int)[]> with
member this.Equals (a,b) = (Array.forall2 (=) a b)
member this.GetHashCode (a) = hash (a |> Array.map hash)
Run Code Online (Sandbox Code Playgroud)
我认为一个原因是Array是一个可变的和.NET兼容的类型.遵循.NET框架中默认的引用比较是有意义的.
你可以HashIdentity.Structural作为一个参数传递.以下示例在数组和元组上使用结构比较:
let mySet = HashSet(HashIdentity.Structural)
let a = [|(1, 2)|]
let b = [|(1, 2)|]
mySet.Add(a)
mySet.Add(b)
// val it : HashSet<(int * int) []> = seq [[|(1, 2)|]]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
683 次 |
| 最近记录: |