gpt4 book ai didi

.net - 如何制作一个 IEqualityComparer for (int*int) [] 进行结构比较?

转载 作者:行者123 更新时间:2023-12-02 02:45:41 24 4
gpt4 key购买 nike

我想创建一个 (int*int)[]hashset,如下

let mySet = new HashSet<_>()

因为我认为 arraytuple 的默认比较器是 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]]

我们可以看到,array 的默认 IEqualityComparer 不是 HashIdentity.Structural,但 list 是。然而,默认的 IComparer 对于它们来说都是结构化的。

这有点奇怪,有什么原因吗?另外,如何使用 tuplearray 的默认结构比较为我的哈希集创建 IEqualityComparer

我知道如何在 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)

最佳答案

我认为一个原因是 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)|]]

关于.net - 如何制作一个 IEqualityComparer for (int*int) [] 进行结构比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12586814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com