c# - 合并两个自定义类返回重复项

标签 c# linq set union equals

我有两个自定义类,ChangeRequestChangeRequests ,其中一个 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在两个ChangeRequestChangeRequests但仍在我的测试中,如果我这样做 IEnumerable<ChangeRequest> unionedCRsIEnum = crs1.Union<ChangeRequest>(crs2); , unionedCRsIEnum最终得到了 ChangeRequest 的两个副本与 CRID 12.

编辑: 我的 Equals 有问题或 GetHashCode在某处实现,因为 Assert.AreEqual(expected, unionedCRs.Distinct(), "Distinct should remove duplicates");失败,expected 的字符串表示和 unionedCRs.Distinct()表明unionedCRs.Distinct()肯定有两份 CR 12。

最佳答案

确保您的 GetHashCode 实现与您的 Equals 一致 - Enumerable.Union 方法似乎同时使用了两者。

如果你实现了一个而不是另一个,你应该从编译器得到警告;您仍然需要确保这两种方法相互一致。这是规则的方便摘要:Why is it important to override GetHashCode when Equals method is overridden?

关于c# - 合并两个自定义类返回重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3134000/

相关文章:

java - Set<CharSequence> 和 Map<CharSequence, Object> 从 CharSequence 更改为 String

c# - SignalR 和 sql 仅依赖于插入

c# - 汇编版本所需的格式是什么?

c# - Linq 到 Sql : Add additional data to result

c# - 从 List<Dictionary<DateTime, Points[]>> 转换为 Dictionary<DateTime, Points[]>

c# - 根据条件删除具有多个id的记录

ruby-on-rails - 是否可以在 Ruby 的 Set 中使用自定义相等运算符?

linq - 如何在 Entity Framework 中使用 LINQ 查询的客户谓词,扩展方法 "Search by Words"

c# - 具有未知数字的动态 Linq 和替换值?

c++ - 在哪里可以找到 NSOrderedSet( Objective-C )源代码?按照 C++ 中的插入顺序从 SET 中读取元素?