Вы можете использовать EqualityComparer или просто переопределить Equals и GetHashCode.
Вы должны убедиться, что все, что вы считаете дубликатом , идентифицируется как имеющее эквивалентный хеш-код, и возвращает значение true при проверке на равенство.
Я предполагаю, что вы не возвращали одинаковые хэш-коды. Не могли бы вы опубликовать код из вашего сравнения равенства?
В качестве теста вы можете сделать:
var set = new HashSet<MyCustomClass>();
var a = new MyCustomClass(1,2);
var b = new MyCustomClass(1,2);
set.Add(a);
set.Add(b);
Assert.IsTrue(a.Equals(b));
Assert.IsTrue(b.Equals(a));
Assert.AreEqual(a.GetHashCode(), b.GetHashCode());
Assert.AreEqual(1, set.Count);
Аналогичный набор тестов применим и к средству сравнения на равенство.
EDIT
Да, как и предполагалось, это функция хеш-кода. Вы должны рассчитать его на основе значений самого типа. Довольно распространенная ошибка.
public int GetHashCode(Mark obj)
{
return ((MyCustomClass)obj).point.GetHashCode();
}
Предполагается, что point
является единственным полем состояния в вашем типе.