С# Hashset содержит неспецифические объекты
Используя этот класс
public class Foo
{
public string c1, c2;
public Foo(string one, string two)
{
c1 = one;
c2 = two;
}
public override int GetHashCode()
{
return (c1 + c2).GetHashCode();
}
}
И этот HashSet
HashSet<Foo> aFoos = new HashSet<Foo>();
Foo aFoo = new Foo("a", "b");
aFoos.Add(aFoo);
aFoos.Add(new Foo("a", "b"));
label1.Text = aFoos.Count().ToString();
Я получаю ответ 2, когда он, безусловно, должен быть 1. Есть ли способ исправить это, поэтому мой HashSet содержит только уникальные объекты?
Спасибо, Эш.
Ответы
Ответ 1
Тип HashSet<T>
категорически использует равенство для определения того, являются ли 2 объекта равными или нет. В типе Foo
вы только переопределили GetHashCode
, а не равенство. Это означает, что проверки равенства будут по умолчанию возвращаться к Object.Equals
, который использует ссылочное равенство. Это объясняет, почему вы видите несколько элементов в HashSet<Foo>
.
Чтобы исправить это, вам нужно переопределить Equals
в типе Foo
.
public override bool Equals(object obj) {
var other = obj as Foo;
if (other == null) {
return false;
}
return c1 == other.c1 && c2 == other.c2;
}
Ответ 2
Вам нужно переопределить метод Equals
. Только GetHashCode
недостаточно.
Ответ 3
Вам также нужно переопределить метод equals. Причиной этого является то, что хэш-код разрешается сталкиваться для двух объектов, которые не равны. В противном случае это не сработает.
public override bool Equals(Object obj)
{
Foo otherObject = obj as Foo;
return otherObject != null && otherObject.c1 == this.c1 && otherObject.c2 == this.c2;
}