2014-10-05 2 views
-2

Я использую словарь для хранения данных в моем проекте C#.C# Словарь: потеря данных

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

public Dictionary<string, AgentHistory> ConnectRequestHistory = new Dictionary<string, AgentHistory>(); //IP - History 

public Dictionary<AgentPlayerObject, AgentPlayerData> PlayerDataList = new Dictionary<AgentPlayerObject, AgentPlayerData>(); // AgentPlayerObject - PlayerData 

Когда я пытаюсь получать PlayerDataList[player].CharName; через некоторое время, словарь потерял его.

+9

«Словарь» не теряет данные. Если вы поместите данные в «Словарь», то он будет там, пока вы не выберете его снова. Если данных нет, это потому, что вы его вытащили. Вы, должно быть, делаете что-то неправильно, мы никак не можем догадаться, что это может быть. – jmcilhinney

+4

Вы проверили реализацию GetHashCode() - реализации в AgentPlayerObject? Если он основан на изменяемых данных, и игрок фактически мутирован, GetHashCode() может возвращать другой хеш, чем он первоначально возвращался, когда игрок был добавлен в словарь, что может объяснить, почему последующая попытка восстановить его данные со временем сработала. –

+0

Как выглядит метод AgentPlayerObject.Equals? Как изменяется PlayerDataList.Count с течением времени? –

ответ

1

Кажется AgentPlayerObject является классом, и его члены равенства не реализованы.

Рассмотрим реализацию членов равенства:

Также рассмотрите вопрос об осуществлении IEquatable Interface, то есть IEquatable<AgentPlayerObject>. If you implement IEquatable you still must override Object’s Equals and GetHashCode:

IEquatable является значительным улучшением по сравнению с этим шаблоном, поскольку он обеспечивает строго типизированный метод equals. Это защищает как вызывающего, так и вызываемого от прохождения несовместимых типов объектов. Кроме того, это позволяет избежать накладных расходов на бокс для типов значений.

Смежные вопросы