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

212
04 июля 2017, 19:54

На данный вопрос уже ответили:

  • Составной ключ в Dictionary 4 ответа
public class Pair<FT, ST>
{
    public FT x;
    public ST y;
    public Pair()
    { }
    public Pair(FT a, ST b)
    {
        x = a;
        y = b;
    }
}
Dictionary<Pair<int, int>,int> used = new Dictionary<Pair<int, int>, int>();

Есть код выше. Я добавляю в used данные таким образом

used[new Pair<int, int>(x, y)] = 1;

И когда хочу проверить used.ContainsKey(new Pair<int, int>(x, y)), то всегда выдается false, даже тогда, когда такие же x,y уже есть. Просто добавляются еще раз. С чем это может быть связано?

Answer 1

Dictionary для того, чтобы обращаться к элементу по ключу, необходимо сравнивать ключи друг с другом.

Вы должны реализовать операцию сравнения двух объектов класса Pair<FT, ST>, например, реализовав интерфейс IEquatable<Pair<FT, ST>>, либо, переопределив метод object.Equals и object.GetHashCode.

Пример реализации IEquatable<Pair<FT, ST>>:

public class Pair<FT, ST> : IEquatable<Pair<FT, ST>>
{
    private FT x;
    private ST y;
    public Pair()
    { }
    public Pair(FT a, ST b)
    {
        x = a;
        y = b;
    }
    public bool Equals(Pair<FT, ST> other)
    {
        return EqualityComparer<FT>.Default.Equals(x, other.x)
            && EqualityComparer<ST>.Default.Equals(y, other.y);
    }
    public override bool Equals(object other)
    {
        if (other is Pair<FT, ST>)
            return Equals((Pair<FT, ST>)other);
        return false;
    }
    public override int GetHashCode()
    {
        return EqualityComparer<FT>.Default.GetHashCode(x)
             ^ EqualityComparer<ST>.Default.GetHashCode(y);
    }
}

Тонкий момент заключается в том, что эта операция сравнения не будет работать, если у типов FT и ST также нет реализации IEquatable<T> или не переопределён метод object.Equals.

UPDATE

Как здесь ниже справедливо дописали в комментариях, при реализации IEquality<T> Microsoft рекомендует также переопределить методы Equals и GetHashCode, а также операторы == и !=.

Так что самый дешёвый способ, это переопределить методы Equals и GetHashCode. Добавил изменения в код.

READ ALSO
Отключение наследования на папке

Отключение наследования на папке

Создаю автоматический файловую структуруИ на папке Private, нужно отключить наследование

233
XAML C# парсинг

XAML C# парсинг

Решил поюзать xaml c# , толком не разобрался ещё , но как я понял в среде разработки приложений для win10Вопрос в следующем : есть ли возможность...

326
WinApi Taskmgr. Не принимает SendMessage()

WinApi Taskmgr. Не принимает SendMessage()

Доброго времени суток, пытаюсь передать диспетчеру задач нажатие клавиши "Alt"

170