【发布时间】:2014-08-09 00:01:25
【问题描述】:
我尝试关注 MSDN 中的 Guidelines,也提到了 This great question,但以下内容似乎与预期不符。
我试图表示一个类似于 FQN 的结构,其中好像 P1 列在 P2 之前,P2 只存在于与 P1 相同的设置。就像作用域的工作原理一样。
关于GetHashCode()的主题
我有一个具有类似属性的类。
class data{
public readonly string p1, p2;
public data(string p1, string p2) {
this.p1 = p1;
this.p2 = p2;
}
public override int GetHashCode()
{
return this.p1.GetHashCode() ^ this.p2.GetHashCode();
}
/*also show the equal for comparison*/
public override bool Equals(System.Object obj)
{
if (obj == null)
return false;
data d = obj as data;
if ((System.Object)d == null)
return false;
/*I thought this would be smart*/
return d.ToString() == this.ToString();
}
public override string ToString() {
return "[" + p1 +"][" + p2+ "]";
}
}
在Dictionary (dict) 中,我使用data 作为键,所以这将使范围看起来像d1.p1.p2(或者更确切地说是d1 的p1 的p2,但是你更愿意想象它)
Dictionary<data,int> dict = new Dictionary<data,int>();
我检查了 d1.p1 和另一个 d2.p1 不同时的行为,操作正确解析。但是,当 d1.p1 和 d2.p1 相同并且 d1 和 d2 的 p2 不同时,我观察到以下行为。
data d1 = new data(){ p1="p1", p2="p2" };
data d2 = new data(){ p1="p1", p2="XX" };
dict.add(d1, 0);
dict.add(d2, 1);
dict[d1] = 4;
结果是两个元素都是4
- GetHashCode() 是否被正确覆盖?
- 是否正确覆盖了 Equals?
- 如果他们都很好,这种行为是如何/为什么会发生的?
关于字典的主题
在监视窗口 (VS2013) 中,我的字典键列表显示给我,而不是像我通常期望的那样每个索引一个键,我的数据对象的每个属性都是单个索引的键。所以我不确定是否存在问题,或者我只是误解了 Watch 窗口将对象表示为键。我知道 VS 将如何显示一个对象,但是我不确定这就是我希望它在字典中的键上显示的方式。
- 我认为 GetHashCode() 是字典的主要“比较”操作,这总是正确的吗?
- 键是对象的字典的真正“索引”是什么?
更新
直接查看每个哈希码后,我注意到它们确实重复。然而,字典并没有确定索引是否存在。下面是我看到的数据示例。
1132917379 string: [ABC][ABC]
-565659420 string: [ABC][123]
-1936108909 string: [123][123]
//second loop with next set of strings
1132917379 string: [xxx][xxx]
-565659420 string: [xxx][yyy]
//...etc
【问题讨论】:
-
你的
GetHashCode将s1的哈希码与自身进行异或,所以它总是返回0。 -
s1来自哪里? -
1.无法重现。 2. 提供实际编译的代码。 3.字典在哈希冲突的情况下使用相等,所以你需要同时实现。
-
我不是要你修复我的代码。除此之外没有其他代码。我有一个关于如何实现这些东西的问题。
标签: c# dictionary