私はIDictionary<KeyClass, ValueClass>
自分のプロジェクトの1つで使用していました。KeyClass
は非常に単純で、整数が 2 つだけ含まれています。
public class KeyClass
{
public int ValueA{get;set;}
public int ValueB{get;set;}
}
次のように辞書から値にアクセスしていました。
var k = new KeyClass(1, 1);
var v = myDictionary[k];
ディクショナリには、および 同様に他の多くのキーKeyClass
を含むキーが確かに含まれていました。しかし、私は例外を得ました:ValueA = 1
ValueB = 1
The given key is not present in the dictionary.
IComparable
クラスで実装しましKeyClass
たが、問題は解決しませんでした。私はグーグルでこのCodeProjectの記事を見つけました。クラス実装IEqualityComparer<T>
インタフェースを利用するための以下のテクニックについて説明します。私は自分のクラスでそれを定義しました:
public class KeyClass
{
public int ValueA{get;set;}
public int ValueB{get;set;}
public class EqualityComparer : IEqualityComparer<KeyClass>
{
public bool Equals(KeyClass a, KeyClass b)
{
return a.ValueA == b.ValueA && a.ValueB == b.ValueB;
}
public int GetHashCode(KeyClass k)
{
return k.ValueA ^ k.ValueB;
}
}
}
IDictionary<KeyClass, ValueClass>
ここで、次のように宣言する必要があります。
var d = new Dictionary<KeyClass, ValueClass>(new KeyClass.EqualityComparer());
その後、物事はうまくいきました。
私の質問は、保存環境 (.Net 4.0、Windows 7 デスクトップ アプリ) で同じクラスを使用していて、別のプロジェクトで実装KeyClass
せずに作業IEqualityComparet<T>
していたのですが、このプロジェクトにクラスを配置した後に動作しなくなったのはなぜですか?