【发布时间】:2016-08-29 02:52:00
【问题描述】:
我知道 HashSet 可以使用 string 和 int 等基本类型,我的问题是 HashSet 中可以使用哪些类型。我正在尝试创建一个笛卡尔坐标的 HashSet,它受益于没有重复的 HashSet。我试过了
HashSet<int[]> temp = new HashSet<int[]>{new int[]{1,1}, new int[]{1,1} }
但这不起作用。寻找一种可用于创建唯一坐标列表的类型。
【问题讨论】:
-
任何类型
T,你可以定义适当的IEqualityComparer<T>来实现你的相等含义,可以在HashSet<T>中使用。 -
所以 Point 在 Microsoft 网站上没有给出任何说明它会使用 IEqualityComparar 的信息。我查看了 Tuple
link 这是否适合用作 > 的 HashSet ? -
您真正要问的是为什么您的两个数组在哈希集中不会被视为相同,这与标记的副本中的问题基本相同。另一个密切相关的副本是stackoverflow.com/questions/7244699/gethashcode-on-byte-array。另请参阅 stackoverflow.com/questions/7138382/… 和 stackoverflow.com/questions/15941389/…,请记住字典与哈希集基本相同,只是它们将值与每个键配对。
-
@PeterDuniho 所以我对字典不太熟悉,所以我看到它的键是通过引用而不是值进行比较的,这与尝试将数组放入等于的 HashSet 类型基本相同值,但我没有在哪里尝试使用 getHashCode 方法/函数。我想指出您将其标记为重复的缺陷;我在问什么类型可以用于 Hashset,这将允许我将 HashSet 用于坐标对。 PhilipH 在他关于类型行为的回答中解释了这一点。
-
“我看到它的键是通过引用而不是值进行比较的”——仅当相同的比较用于
HashSet<T>时。除非您提供自己的比较器,否则两者都使用EqualityComparer<T>.Default。引用相等是引用类型的默认设置,但任何类型都可以实现其他相等。