如何在字典中使用自定义的通用类型作为键?
如何在字典中使用自定义的通用类型作为键?
我想在字典中使用自定义的泛型类作为键。我应该如何重写Equals
和GetHashCode
方法?\n例如,\n
public class SomeKey{ 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 otherKey) { //在这里选择什么是最佳选项? } public override int GetHashCode() { //在这里选择什么是最佳选项? } }
\n谢谢
问题的原因是当我们想要在Dictionary中使用自定义的泛型类型作为键时,需要重写GetHashCode和Equals方法,以确保相同的对象始终返回相同的值。在这个问题中,我们需要根据对象的属性来计算哈希码,并确保相同的对象返回相同的哈希码和相等的结果。
解决方法是根据msdn上的建议,重写GetHashCode方法并实现Equals方法,以确保对象的哈希码和相等性是可靠的。下面是一个示例代码,演示了如何使用自定义的泛型类型作为Dictionary的键:
public class MyKey{ private T value; public MyKey(T value) { this.value = value; } public override int GetHashCode() { return value.GetHashCode(); } public override bool Equals(object obj) { if (obj is MyKey ) { MyKey other = (MyKey )obj; return value.Equals(other.value); } return false; } } public class Program { public static void Main(string[] args) { Dictionary , string> myDictionary = new Dictionary , string>(); MyKey key1 = new MyKey (1); MyKey key2 = new MyKey (2); myDictionary[key1] = "Value 1"; myDictionary[key2] = "Value 2"; Console.WriteLine(myDictionary[key1]); // Output: Value 1 Console.WriteLine(myDictionary[key2]); // Output: Value 2 } }
通过重写GetHashCode和Equals方法,我们可以确保自定义的泛型类型可以作为Dictionary的键。这样,我们就可以使用自定义的类型来进行键值对的存储和检索了。
这段内容主要讨论了如何在Dictionary中使用自定义的泛型类型作为键,并提供了解决方法。问题的原因是需要重写Equals和GetHashCode方法来确保键的唯一性和正确性。
在解决方法中,作者首先使用Equals方法来比较Value1和Value2的相等性。然后,在GetHashCode方法中,作者使用异或(^)运算符来组合Value1和Value2的哈希码。
文章还提到,计算哈希码有很多替代的方法,如果性能是一个瓶颈,可以考虑使用更专门的方法。作者给出了一些关于如何计算哈希码的链接供读者参考。
关于为什么使用异或运算符的问题,作者解释说,选择最好的哈希码取决于值的分布情况。如果对值的分布情况一无所知,异或是一个相当可靠和简单的方法。如果OP有关于值分布的信息,那么可能需要选择其他的方法。这些只有在哈希码是性能瓶颈时才有影响。
此外,还提到了对于泛型类型定义,如果没有where约束来表示相等比较是可能的,那么使用==运算符是行不通的。作者通过使用Equals方法解决了这个问题。
最后,还有一个关于为什么使用&而不是&&的问题。作者解释说,使用&运算符是为了同时进行位运算,而不是逻辑运算。
这段内容提供了关于如何在Dictionary中使用自定义泛型类型作为键的解决方法,并讨论了相关问题和注意事项。