6

我有实现如下接口的类

class Person : IHuman
{
}

我创建了如下字典

Dictionary <IHuman, collection<int>> dic = new Dictionary <IHuman, collection<int>>();

现在我添加一个键值对,如下所示

dic.Add (person, myCollection);

再次,当我将 containsKey 用于“相同的人对象和相同的 HashCode”时,如下所示

if (dic.ContainsKey(person))
{
    dic[person] = mynewcollection;
}
else
{
    dic.Add (person, mynewcollection);
}

这里 ContainsKey() 返回 false 并使用相同的 person 对象再创建一个键值对。

我想知道怎么可能......请帮我解决这个问题。

4

3 回答 3

11

是的,这是可能的,但你应该覆盖你的Equals班级。否则键(即人)将通过引用进行比较。并且每个新实例都将被认为是不同的,即使所有字段都具有相同的值。GetHashCodePerson

于 2012-11-23T12:50:23.587 回答
4

基本上,这听起来像是您在压倒一切GetHashCode()或不正确。Equals如果没有更多信息,我们真的无法判断 - 大概您的Person课程中实际上有一些代码。

然而,基本上这段代码是愚蠢的:

if (dic.ContainsKey(person))
{
    dic[person] = mynewcollection;
}
else
{
    dic.Add (person, mynewcollection);
}

在这两种情况下,字典都会以一个键为...person且值为mynewcollection... 的条目结束,这与您编写时得到的完全相同:

dic[person] = mynewcollection;

这将根据需要添加新条目或覆盖现有条目。

于 2012-11-23T12:50:36.903 回答
1

您需要在您的 person 对象上覆盖 equals 。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms173147.aspx

于 2012-11-23T12:51:28.493 回答