Не предоставив нам ни одного примера ваших дубликатов сообщений, которые не удаляются, я собираюсь предположить, что использование вами DateTime в вашем коде проверки равенства является вероятным виновником. Это очень распространено, и легко написать что-то вроде ' SentDate = DateTime.Now; ', и это позже запутает систему. Это всего лишь предположение.
Между тем, я бы предположил, что ваши функции равенства и хэш-кода - это путь к территории избыточного убийства. Теперь я собираюсь предположить, что «ID» для классов Message и MessageThread должны быть уникальными, и в этом случае вы действительно можете упростить свою логику, и вам будет легче добраться до сути вашей проблемы, например так;
public override bool Equals(object other)
{
return Equals(other as Message);
}
public bool Equals(Message other)
{
if (other == null) { return false; }
return this.Id == other.Id;
}
public override int GetHashCode()
{
// If the ID is unique, then it satisfied the purpose of 'GetHashCode'
return this.Id;
}
Очевидно, вы захотите сделать это и для других ваших классов. Преимущество в том, что меньше движущихся частей и, следовательно, меньше шансов на то, чтобы что-то пошло не так. Кроме того, тела сообщения, отправители и т. Д. Не нужны для определения уникальности сообщения.