(1) Я знаю, что GetHashCode
должен возвращать одно и то же число для двух объектов, если они равны.
(2) Я также знаю, что SequenceEqual
сравнивает каждое значение List
, а Equals(list1, list2)
возвращает значение true, только если list1
и list2
являются одним и тем же экземпляром.
Итак, рассмотрим этот код:
public List<ClassB> SampleList { get; set; }
public string Str { get; set; }
protected bool Equals(Uncorrectable other)
{
return Enumerable.SequenceEqual(this.SampleList, other.SampleList) && string.Equals(this.Str, other.Str);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) { return false; }
if (ReferenceEquals(this, obj)) { return true; }
if (obj.GetType() != this.GetType()) { return false; }
return this.Equals((ClassA) obj);
}
public override int GetHashCode()
{
unchecked
{
return
((this.SampleList != null ? this.SampleList.GetHashCode() : 0)*397) ^
(this.Str != null ? this.Str.GetHashCode() : 0);
}
}
Мне действительно нужно это поведение ((2) с использованием SequenceEqual
) для Equals
, в основном для модульного тестирования: сделайте этот код Assert.AreEqual(classA1, classA2)
работающим.
Но часть моего кода, вероятно, сломана, потому что в этом случае
int hash1 = new List<ClassB>().GetHashCode();
int hash2 = new List<ClassB>().GetHashCode();
hash1
и hash2
не равны.
Так что в моем ClassA
(1) не соблюдается.
Какое лучшее решение:
- Измените метод
ClassA.Equals
, чтобы использоватьEquals(this.SampleList, other.SampleList)
вместоEnumerable.SequenceEqual(this.SampleList, other.SampleList)
, и измените все мои тесты. - Создайте еще одну реализацию
IEnumerable
, где переопределениеEquals
похоже наSequenceEqual
. - Измените
ClassA.GetHashCode
, чтобы вызыватьGetHashCode
для всех элементов списка. - Ничего не делать
- Еще один?