如何查看c ++ / cli ref项目列表是否相等?

时间:2014-01-07 10:01:54

标签: c# c++-cli equals equality

c ++ / cli ref class DataEntity实现了Equals和HashCode。我可以通过以下方式检查Equals实现的行为:

entity1.Equals(entity2);

(C#source),它可以正常工作。 如果我现在有一个这样的DataEntities列表并且我调用list1.Equlas(list2),则永远不会调用DataEntity#Equals方法。

是什么原因,以及如何正确使用List.Equals(...)方法?


C ++ / CLI来源:

public ref class DataEntity : System::Object
{
public:
    DataEntity(System::String^ name, 
        System::String^ val) 
        : m_csName(name),
        m_csValue(val) {}

    System::String^ GetName() { return m_csName; }
    System::String^ GetValue() { return m_csValue; }
    virtual bool Equals(Object^ obj) override {
        if(!obj){
            return false;
        }
        DataEntity^ other = (DataEntity^)obj;
        if(other){
            if(m_csName->Equals(other->m_csName) &&
                m_csValue->Equals(other->m_csValue)){
                    return true;
            }
            return false;
        }
        return false;
    }
    virtual int GetHashCode() override {
        const int iPrime = 17;
        long iResult = 1;
        iResult = iPrime * iResult + m_csName->GetHashCode();
        iResult = iPrime * iResult + m_csValue->GetHashCode();
        return iPrime;
    }

private:
    System::String^ m_csName;       
    System::String^ m_csValue;
};

C#单元测试用例失败了!

[Test]
public void Test()
{
    DataEntity de1 = new DataEntity("A", "B");
    List<DataEntity> des1 = new List<DataEntity>();
    des1.Add(de1);
    List<DataEntity> des2 = new List<DataEntity>();
    des2.Add(de1);

    Assert.IsTrue(des1.Equals(des2));
}

2 个答案:

答案 0 :(得分:0)

List<T>不会覆盖Object.Equals。因此,您将获得Equals的默认实现,即引用相等。

为了测试列表内容是否相等,您需要迭代列表并比较每个元素,或使用链接的重复问题中提到的Linq方法。

答案 1 :(得分:0)

在单元测试的情况下,有一个实用方法叫做:

CollectionAssert.AreEqual(expectedList, actualList);

这简化了很多。