Я использовал IDictionary<KeyClass, ValueClass>
в одном из моих проектов. KeyClass
очень просто, содержит всего два целых числа.
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>
в другом проекте, но почему он перестал работать после того, как я поместил классы в этом проекте?