Словарь позволяет мне вставлять дубликаты ключей - PullRequest
2 голосов
/ 18 января 2012

Я создал несколько классов, чтобы у меня был словарь с парой в качестве ключа

public class RouteKey
{
    public Equip Equipment { get; set; }
    public Destiny Destiny { get; set; }

    public RouteKey() { }
    public RouteKey(Equip Equipment, Destiny Destiny) {
        this.Equipment = Equipment;
        this.Destiny = Destiny;
    }
}

public override bool Equals(object obj)
{
    if (obj == null) return false;

    if (this.GetType() != obj.GetType()) return false;

    RouteKey rk = (RouteKey)obj;

    // use this pattern to compare reference members
    if (!Object.Equals(Equipment, rk.Equipment)) return false;

    // use this pattern to compare value members
    if (!Destiny.Equals(rk.Destiny)) return false;

    return true;        
}

public class RouteValue
{
    public string Endpoint { get; set; }
    public bool Enabled { get; set; }

    public RouteValue() { }
    public RouteValue(string Endpoint, bool Enabled) {
        this.Endpoint = Endpoint;
        this.Enabled = Enabled;
    }
}

public Dictionary<RouteKey, RouteValue> Routes;

Моя проблема в том, что я могу запустить этот код без ошибок ...

RouteKey rk1 = new RouteKey(Equip.SpaceShip, Destiny.sun);
RouteKey rk2 = new RouteKey(Equip.SpaceShip, Destiny.sun);
RouteKey rk3 = new RouteKey(Equip.Boat, Destiny.hell);

RouteValue rv1 = new RouteValue("rv1", true);
RouteValue rv2 = new RouteValue("rv2", false);
RouteValue rv3 = new RouteValue("rv3", true);

Routes.Add(rk1, rv1);
Routes.Add(rk3, rv3);
Routes.Add(rk2, rv2);

Я пытался добавить метод equals в класс RouteKey, но в отладке я вижу, что код никогда не проходит этим методом.

Что можно сделать, чтобы словарь былвести себя как положено?

Ответы [ 3 ]

7 голосов
/ 18 января 2012

Ваш RouteKey должен переопределить метод GetHashCode() таким образом, чтобы хэш-коды равных RouteKey экземпляров также были равны (но не обязательно наоборот).

3 голосов
/ 18 января 2012

В вашем классе RoutKey есть только переопределенное значение Equals().

Вы также должны переопределить GetHashCode() - это то, что Dictionary будет использовать для проверки на равенство.

При переопределении Equals() и GetHashCode() вы также должны рассмотреть возможность переопределения операторов == и !=.

Я предлагаю прочитать Рекомендации по переопределению Equals () и Operator == (Руководство по программированию в C #) в MSDN.

2 голосов
/ 18 января 2012

Для класса RouteKey вам необходимо переопределить метод GetHashCode ():

http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx

Также вы можете проверить этот вопрос SO: Когда мы делаем GetHashCode ()для словаря?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...