#c_sharp
This question already has answers here: Составной ключ в Dictionary (4 ответа) Closed 2 года назад. public class Pair{ public FT x; public ST y; public Pair() { } public Pair(FT a, ST b) { x = a; y = b; } } Dictionary ,int> used = new Dictionary , int>(); Есть код выше. Я добавляю в used данные таким образом used[new Pair (x, y)] = 1; И когда хочу проверить used.ContainsKey(new Pair (x, y)), то всегда выдается false, даже тогда, когда такие же x,y уже есть. Просто добавляются еще раз. С чем это может быть связано?
Ответы
Ответ 1
Dictionary для того, чтобы обращаться к элементу по ключу, необходимо сравнивать ключи друг с другом. Вы должны реализовать операцию сравнения двух объектов класса Pair, например, реализовав интерфейс IEquatable >, либо, переопределив метод object.Equals и object.GetHashCode. Пример реализации IEquatable >: public class Pair : IEquatable > { private FT x; private ST y; public Pair() { } public Pair(FT a, ST b) { x = a; y = b; } public bool Equals(Pair other) { return EqualityComparer .Default.Equals(x, other.x) && EqualityComparer .Default.Equals(y, other.y); } public override bool Equals(object other) { if (other is Pair ) return Equals((Pair )other); return false; } public override int GetHashCode() { return EqualityComparer .Default.GetHashCode(x) ^ EqualityComparer .Default.GetHashCode(y); } } Тонкий момент заключается в том, что эта операция сравнения не будет работать, если у типов FT и ST также нет реализации IEquatable или не переопределён метод object.Equals. UPDATE Как здесь ниже справедливо дописали в комментариях, при реализации IEquality Microsoft рекомендует также переопределить методы Equals и GetHashCode, а также операторы == и !=. Так что самый дешёвый способ, это переопределить методы Equals и GetHashCode. Добавил изменения в код.
Комментариев нет:
Отправить комментарий