Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Dictionary and custom pair [дубликат]

#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. Добавил изменения в код.

Комментариев нет:

Отправить комментарий