2011-04-30 31 views
2

我想使用自定义泛型类作为字典中的键。我应该如何覆盖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? 
    } 
} 

由于

回答

5

平等是简单的:测试Value1Value2是相等的。

对于散列码,最简单的方法是使用异或来合并来自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更适合的东西。

例如,堆栈溢出提供这些链接(还有更多):

+0

听起来不错。关心阐述或给出一个关于为什么xor是一个好主意的链接? – Nicolas78 2011-04-30 13:57:55

+0

那么,对于散列码来说,最好的选择很大程度上取决于值的分布。 xor是一种非常可靠,简单的方法,如果您对值的分布一无所知,您可以使用它。如果OP知道这样的信息,那么其他选择可能是适当的。所有这些只在散列码是性能瓶颈时才重要。 – 2011-04-30 14:03:05

+0

你介意添加一个代码示例吗?谢谢! – MalcomTucker 2011-04-30 14:03:24

1

你应该重写它的方式,GetHashcode可靠地返回相同的值同一个对象,并且Equals总是为相同的对象返回true。 msdn对实施GetHashcode(备注部分)有一些建议。

+0

你介意添加一个代码示例吗?谢谢! – MalcomTucker 2011-04-30 14:05:23

+0

大卫提供了一个很好的。 – Femaref 2011-04-30 14:49:31

相关问题