我有一些代码想要使用元组作为字典的关键字,但是我在解锁密钥时遇到了问题。
Dictionary<Tuple<string, MyClass>, MyClass> Map = new Dictionary<Tuple<string, MyClass>, MyClass>
{
{ Tuple.Create(s1, new MyClass { value = v1 }), new MyClass { value = r1 } }
}
Tuple<string, MyClass> key = Tuple.Create(s, o);
foreach (Tuple<string, MyClass> t in Map.Keys)
{
if (t.GetType() == key.GetType()
&& t.Item1.Equals(key.Item1) && t.Item2.Equals(key.Item2)
&& t.Item1.GetHashCode() == key.Item1.GetHashCode() && t.Item2.GetHashCode() == key.Item2.GetHashCode())
{
bool test2 = t.Equals(key); // False?
bool test3 = t.GetHashCode() == key.GetHashCode(); // True
}
}
答案 0 :(得分:0)
这是平等所必需的:
t.Item2.Equals(key.Item2)
所以它取决于T
。如果T
是值类型,如果值相等,则返回true。
如果T
是引用类型,那么只有当Item2
引用同一个实例或T overrides
等于`时才会返回true,以便可以将不同的实例等同起来。< / p>
在此之前,您需要在==
的两个实例之间检查T
。这可能是多余的,但出于同样的原因,它也会失败。除非您还覆盖==
运算符,否则它将检查引用类型以获取引用相等。
我首先删除==
支票 - 只需使用Equals
- 然后确保您可以期望Equals
在您预期时返回true。这可以通过确保T
覆盖Equals
来提供您期望的行为,或者确保两者都是同一个实例。