我有两个自定义类,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);
}
编辑:我在ChangeRequest
和ChangeRequests
上都覆盖了GetHashCode
,但在我的测试中,如果我执行IEnumerable<ChangeRequest> unionedCRsIEnum = crs1.Union<ChangeRequest>(crs2);
,unionedCRsIEnum
最终会有两个具有CRID
为12的ChangeRequest
。
编辑:我的Equals
或GetHashCode
实现肯定出了问题,因为Assert.AreEqual(expected, unionedCRs.Distinct(), "Distinct should remove duplicates");
失败了,而expected
和unionedCRs.Distinct()
的字符串表示显示unionedCRs.Distinct()
中肯定有两个CR 12的副本。
ChangeRequests.Equals
和ChangeRequests.GetHashCode
的实现?在这些方法中犯一个拼写错误就会破坏对象的标识,所以需要小心。 - Tim RobinsonChangeRequests.Equals
的两个实现到我的问题中,但是我没有重写GetHashCode
...也许我应该这样做! - Sarah VesselsGetHashCode
方法需要与你的Equals
方法保持一致。看起来Union
方法确实同时使用了这两个方法。 - Tim RobinsonGetHashCode
”的建议发表为一个答案——我会选择它作为选定的答案!结果证明这是一个GetHashCode
问题。现在Union
已经按预期工作。 :) - Sarah Vessels