У меня есть два пользовательских класса, ChangeRequest
и ChangeRequests
, где ChangeRequests
может содержать множество ChangeRequest
экземпляров.
public class ChangeRequests : IXmlSerializable, ICloneable, IEnumerable<ChangeRequest>,
IEquatable<ChangeRequests> { ... }
public class ChangeRequest : ICloneable, IXmlSerializable, IEquatable<ChangeRequest>
{ ... }
Я пытаюсь объединить два ChangeRequests
экземпляры.Однако дубликаты, похоже, не удаляются.Мой модульный тест MSTest выглядит следующим образом:
var cr1 = new ChangeRequest { CRID = "12" };
var crs1 = new ChangeRequests { cr1 };
var crs2 = new ChangeRequests
{
cr1.Clone(),
new ChangeRequest { CRID = "34" }
};
Assert.AreEqual(crs1[0], crs2[0], "First CR in both ChangeRequests should be equal");
var unionedCRs = new ChangeRequests(crs1.Union<ChangeRequest>(crs2));
ChangeRequests expected = crs2.Clone();
Assert.AreEqual(expected, unionedCRs, "Duplicates should be removed from a Union");
Тест не пройден в последней строке, и unionedCRs
содержит две копии cr1
.Когда я пытался отлаживать и проходить через каждую строку, у меня была точка останова в ChangeRequest.Equals(object)
на первой строке, а также в первой строке ChangeRequest.Equals(ChangeRequest)
, но ни одна не была нажата.Почему объединение содержит дубликаты ChangeRequest
экземпляров?
Изменить: в соответствии с запросом, здесь ChangeRequests.Equals(ChangeRequests)
:
public bool Equals(ChangeRequests other)
{
if (ReferenceEquals(this, other))
{
return true;
}
return null != other && this.SequenceEqual<ChangeRequest>(other);
}
А вот ChangeRequests.Equals(object)
:
public override bool Equals(object obj)
{
return Equals(obj as ChangeRequests);
}
Редактировать: Я преодолел GetHashCode
на ChangeRequest
и ChangeRequests
, но все еще в моем тесте, если я выполню IEnumerable<ChangeRequest> unionedCRsIEnum = crs1.Union<ChangeRequest>(crs2);
, unionedCRsIEnum
заканчивается двумякопии ChangeRequest
с CRID
12.
Edit: что-то должно быть в моих реализациях Equals
или GetHashCode
где-то, так как Assert.AreEqual(expected, unionedCRs.Distinct(), "Distinct should remove duplicates");
терпит неудачу, истроковые представления expected
и unionedCRs.Distinct()
показывают, что unionedCRs.Distinct()
определенно имеет две копии CR 12.