这个问题来自关于元组的讨论.
我开始考虑元组应该具有的哈希码.如果我们接受KeyValuePair类作为元组怎么办?它不会覆盖GetHashCode()方法,所以可能它不会知道它的"子"的哈希码...所以,运行时将调用Object.GetHashCode(),它不知道真实的对象结构.
然后我们可以创建一些引用类型的实例,它们实际上是Equal,因为重载的GetHashCode()和Equals().并使用它们作为元组中的"孩子"来"欺骗"字典.
但它不起作用!运行时以某种方式计算出我们元组的结构并调用我们类的重载GetHashCode!
它是如何工作的?Object.GetHashCode()的分析是什么?
当我们使用一些复杂的密钥时,它会在某些不好的情况下影响性能吗?(可能,不可能的情况......但仍然)
以此代码为例:
namespace csharp_tricks
{
class Program
{
class MyClass
{
int keyValue;
int someInfo;
public MyClass(int key, int info)
{
keyValue = key;
someInfo = info;
}
public override bool Equals(object obj)
{
MyClass other = obj as MyClass;
if (other == null) return false;
return keyValue.Equals(other.keyValue);
}
public override int GetHashCode()
{
return keyValue.GetHashCode();
}
}
static void Main(string[] args)
{
Dictionary<object, object> dict = new Dictionary<object, object>();
dict.Add(new KeyValuePair<MyClass,object>(new MyClass(1, …Run Code Online (Sandbox Code Playgroud) 结束了这个糟糕的数据结构:
List<KeyValuePair<string, KeyValuePair<string, string>>>
Run Code Online (Sandbox Code Playgroud)
它不太可能变得很大(我估计<1K)并且我将一遍又一遍地重复这个列表.
任何人都可以想到内置类型的更好的选择?