【问题标题】:HashSet usable types? [duplicate]HashSet 可用类型? [复制]
【发布时间】: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&lt;T&gt;来实现你的相等含义,可以在HashSet&lt;T&gt;中使用。
  • 所以 Point 在 Microsoft 网站上没有给出任何说明它会使用 IEqualityComparar 的信息。我查看了 Tuplelink 这是否适合用作 > 的 HashSet ?
  • 您真正要问的是为什么您的两个数组在哈希集中不会被视为相同,这与标记的副本中的问题基本相同。另一个密切相关的副本是stackoverflow.com/questions/7244699/gethashcode-on-byte-array。另请参阅 stackoverflow.com/questions/7138382/…stackoverflow.com/questions/15941389/…,请记住字典与哈希集基本相同,只是它们将值与每个键配对。
  • @PeterDuniho 所以我对字典不太熟悉,所以我看到它的键是通过引用而不是值进行比较的,这与尝试将数组放入等于的 HashSet 类型基本相同值,但我没有在哪里尝试使用 getHashCode 方法/函数。我想指出您将其标记为重复的缺陷;我在问什么类型可以用于 Hashset,这将允许我将 HashSet 用于坐标对。 PhilipH 在他关于类型行为的回答中解释了这一点。
  • “我看到它的键是通过引用而不是值进行比较的”——仅当相同的比较用于HashSet&lt;T&gt;时。除非您提供自己的比较器,否则两者都使用EqualityComparer&lt;T&gt;.Default。引用相等是引用类型的默认设置,但任何类型都可以实现其他相等。

标签: c# types hashset


【解决方案1】:

您正在创建一个引用类型的 HashSet。相等比较时不比较引用类型(除非是 String)的内容,只比较引用指针本身。

您正在向数组实例的 HashSet 添加两个单独的数组实例。由于引用类型通常不使用它们的内容相互比较,只使用它们的“内存引用”,因此您的代码将无法按您的预期工作。这两个实例是不同的——即使它们的内容是相同的。

Tuple 类覆盖此行为,并使用其成员的哈希码之和将一个实例与另一个实例进行比较。 Int[] 数组不会覆盖此行为。大多数 .net 引用类型不会覆盖比较运算符 - 元组是一个例外。

【讨论】:

    猜你喜欢
    • 2012-09-24
    • 2013-03-05
    • 1970-01-01
    • 2016-12-26
    • 2021-05-22
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多