Объект C # как проблема ключевого словарей - PullRequest
0 голосов
/ 23 августа 2010

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

// With loop - not work
for (int i = 0; i < 5; i++)
{
    Location l = new Location();
    l.Identifier = i.ToString();
    _locations.Add(l);
}
////

Dictionary<Location, Route> _paths = new Dictionary<Location, Route>();
foreach (Location loc in _locations)
{
    _paths.Add(loc, new Route(loc.Identifier));
}

Location start = new Location();
start.Identifier = "1";
_paths[start].Cost = 0;       //raised Key not exists error

Вот рабочая версия ...

// Without Loop - it work
Location l1 = new Location();
l1.Identifier = "1";
_locations.Add(l1);

Location l2 = new Location();
l2.Identifier = "2";
_locations.Add(l2);

Location l3 = new Location();
l3.Identifier = "3";
_locations.Add(l3);
/////

Dictionary<Location, Route> _paths = new Dictionary<Location, Route>();
foreach (Location loc in _locations)
{
    _paths.Add(loc, new Route(loc.Identifier));
}

Location start = new Location();
start.Identifier = "1";
_paths[start].Cost = 0;

Есть идеи?Спасибо.

Редактировать: Класс местоположения

public class Location

{
    string _identifier;
    public Location()
    {

    }

    public string Identifier
    {
        get { return this._identifier; }
        set { this._identifier=value; }
    }

    public override string ToString()
    {
        return _identifier;
    }
}

Ответы [ 4 ]

3 голосов
/ 23 августа 2010

Ни один из них не должен работать, если вы не переопределите Equals и GetHashCode в своем классе Location, чтобы Dictionary соответствовал Location ключевым объектам на основе равенства их Идентификатора, а не равенства объектов.

0 голосов
/ 23 августа 2010

В дополнение к GetHashCode вам необходимо переопределить Equals, как он вызывается, когда сообщается, что хеш-коды равны, чтобы завершить равенство объектов. В отдельных хеш-кодах можно только доказать неравенство. Неравные объекты могут иметь одинаковые хеш-коды; одинаковые хэш-коды не доказывают, что объекты равны.

0 голосов
/ 23 августа 2010

Обе части кода, которые вы упомянули, не будут работать. Попробуйте запустить код с тегом «Рабочая версия» еще раз, он должен выдать то же исключение, что и первый.

0 голосов
/ 23 августа 2010

Реализует ли класс Location GetHashCode?Если нет, вы должны переопределить это и убедиться, что он возвращает уникальный int для каждого экземпляра.

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