要将引用类型的值用作字典键,必须做什么?

发布于 2024-09-02 02:26:02 字数 203 浏览 4 评论 0原文

假设我有一个类 T,我想将其用作 Dictionary 集合中的键。

我必须在 T 中实现什么,以便这些键基于 T 的值而不是 T 引用?

我希望它只是 GetHashCode()

Suppose I have a class T that I want to use as a key in a Dictionary<T,U> collection.

What must I implement in T so that these keys are based on values of T rather than T references?

I'm hoping it's just GetHashCode().

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

沙与沫 2024-09-09 02:26:02

您必须实现 GetHashCode() 和 Equals()。

字典是底层的哈希表,因此您可能需要阅读以下内容: Equals/GetHashCode 的陷阱 – 哈希表如何工作?

You must implement GetHashCode() and Equals().

Dictionary is a Hashtable below the covers, so you might want to read this: Pitfalls Of Equals/GetHashCode – How Does A Hash Table Work?

小红帽 2024-09-09 02:26:02

如果您不在字典构造函数中传递任何 IEqualityComparer,它将使用 EqualityComparer.Default,MSDN 定义为:

Default 属性检查是否
类型 T 实现 System.IEquatable(Of T)
接口,如果是,则返回一个
EqualityComparer(Of T) 表示
使用该实现。否则,
它返回一个 EqualityComparer(Of T),它使用以下重写
T 提供的 Object.Equals 和 Object.GetHashCode。

因此,实现 IEquatable 将是我的选择(如果实现它,覆盖 Equals也是有意义的无论如何,>GetHashCode)。

If you don't pass any IEqualityComparer<T> in the dictionary constructor, it will use EqualityComparer<T>.Default which is defined by MSDN as :

The Default property checks whether
type T implements the System.IEquatable(Of T)
interface and, if so, returns an
EqualityComparer(Of T) that
uses that implementation. Otherwise,
it returns an EqualityComparer(Of T) that uses the overrides of
Object.Equals and Object.GetHashCode provided by T.

So implementing IEquatable<T> would be my choice (if you implement it it also makes sense to override Equals and GetHashCode anyway).

兲鉂ぱ嘚淚 2024-09-09 02:26:02

要么实现EqualsGetHashCode或者创建适当的IEqualityComparer具有适合您的地图的正确形式的相等匹配。

我更喜欢 IEqualityComparer 路线:在许多情况下,没有一种明显正确的平等形式 - 您希望根据情况以不同的方式将对象视为平等。在这种情况下,自定义相等比较器正是您所需要的。当然,如果存在自然的相等操作,那么在类型本身中实现 ​​IEquatable是有意义的……如果可以的话。 (IEqualityComparer 的另一个好处是您可以为您无法控制的类型实现它。)

Either implement Equals and GetHashCode or create an appropriate IEqualityComparer<T> which has the right form of equality matching for your map.

I rather like the IEqualityComparer<T> route: in many cases there isn't one obviously-right form of equality - you want to treat objects as equal in different ways depending on the situation. In that case, a custom equality comparer is just what you need. Of course, if there is a natural equality operation, it makes sense to implement IEquatable<T> in the type itself... if you can. (Another benefit of IEqualityComparer<T> is that you can implement it for types you have no control over.)

深居我梦 2024-09-09 02:26:02

You need to override Equals(object obj). It is always expected that you implement GetHashCode when you modify Equals. Read this article at MSDN.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文