а) Предполагая, что вы не хотите, чтобы сравнить объекты по ссылки, вы должны переопределить GetHashCode
и Equals
методы MyClass
HashSet<MyClass> myHash = new HashSet<MyClass>();
MyClass m1 = new MyClass("1", "123");
MyClass m2 = new MyClass("1", "123");
myHash.Add(m1);
bool b = myHash.Contains(m2); //true
public class MyClass
{
private string m_x;
private string m_y;
public MyClass(string x, string y)
{
m_x = x;
m_y = y;
}
public override int GetHashCode()
{
return m_x.GetHashCode()^m_y.GetHashCode();
}
public override bool Equals(object obj)
{
if (ReferenceEquals(this, obj)) return true;
if (obj == null) return false;
var other = obj as MyClass;
return m_x == other.m_x && m_y == other.m_y;
}
}
б) Вы также можете использовать IEqualityComparer для сравнения ваших объектов, но в этом случае вам понадобятся некоторые общедоступные свойства
public class MyClass
{
public string m_x;
public string m_y;
public MyClass(string x, string y)
{
m_x = x;
m_y = y;
}
}
public class MyEqualityComparer : IEqualityComparer<MyClass>
{
public bool Equals(MyClass x, MyClass y)
{
return x.m_x == y.m_x && x.m_y == y.m_y;
}
public int GetHashCode(MyClass obj)
{
return obj.m_x.GetHashCode()^obj.m_y.GetHashCode();
}
}
Теперь вам нужно только дать компаратор конструктору HashSet в
HashSet<MyClass> myHash = new HashSet<MyClass>(new MyEqualityComparer());
Можете ли вы показать фактический код? Это должно выбросить NRE. –
Override * GetHashCode * и * Equals * –
Невозможно воспроизвести, отлично работает для меня. Можете ли вы опубликовать код, который воспроизводит поведение? –