6

以下のようにインターフェースを実装するクラスがあります

class Person : IHuman
{
}

以下のように辞書を作成しました

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

今、私は以下のように1つのキーと値のペアを追加します

dic.Add (person, myCollection);

以下のように、「同じ人物オブジェクトと同じHashCode」にcontainsKeyを使用すると、再び

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

ここで、ContainsKey() は false を返し、同じ人物オブジェクトでもう 1 つのキーと値のペアを作成します。

どうすればそれが可能になるのだろうと思いました... この問題を解決するのを手伝ってください。

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 に答える