【问题标题】:How to use a custom generic type as a key in a Dictionary?如何使用自定义泛型类型作为字典中的键?
【发布时间】:2011-08-16 01:53:07
【问题描述】:

我想使用自定义泛型类作为字典中的键。我应该如何覆盖EqualsGetHashCode

例如,

public class SomeKey<T,V>
{
    public T Value1 { get; set; }
    public V Value2 { get; set; }

    public SomeKey(T val1, V val2)
    {
        this.Value1 = val1;
        this.Value2 = val2;
    }

    public override bool Equals(SomeKey<T,V> otherKey)
    {
        //whats the best option here?
    }

    public override int GetHashCode()
    {
        //whats the best option here?
    }
}

谢谢

【问题讨论】:

    标签: c#


    【解决方案1】:

    相等很简单:测试Value1Value2 是否相等。

    对于哈希码,最简单的方法是使用 xor 组合来自 Value1Value2 的哈希码。

    public override bool Equals(SomeKey<T,V> otherKey)
    {
        return Value1.Equals(otherKey.Value1) && Value2.Equals(otherKey.Value2);
    }
    
    public override int GetHashCode()
    {
        return Value1.GetHashCode() ^ Value2.GetHashCode();
    }
    

    有很多计算哈希码的替代方法。如果性能是瓶颈,那么您应该考虑比 xor 更适合的东西。

    例如,Stack Overflow 提供这些链接(以及更多):

    【讨论】:

    • 听起来不错。想详细说明或提供一个链接,说明为什么 xor 是一个好主意?
    • 嗯,对于哈希码,最佳选择很大程度上取决于值的分布。 xor 是一种非常可靠、简单的方法,如果您对值的分布一无所知,您可以使用它。如果 OP 知道这些信息,那么其他选择可能是合适的。所有这些只有在哈希码是性能瓶颈时才重要。
    • 但是如果他创建了两个具有相同值的 SomeKey,它们是否应该受到相同的威胁?
    • @Marino 他们被同等对待。
    • 关于您最新添加的另一条评论,相等比较 == 如果没有 where 约束表明这是可能的,则不会对泛型类型定义起作用
    【解决方案2】:

    您应该以GetHashcode 可靠地为同一对象返回相同值的方式覆盖它,并且Equals 始终为同一对象返回true。 msdn 对实现GetHashcode 有一些建议(备注部分)。

    【讨论】:

      猜你喜欢
      • 2011-06-21
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 2013-06-05
      相关资源
      最近更新 更多