2014-01-07 2 views
0

Класс C++/cli ref DataEntity реализует Equals и HashCode. Я могу проверить поведение Equals реализации через:Как проверить список элементов ссылок C++/cli для равенства?

entity1.Equals(entity2); 

(источник C#) и он работает правильно. Если у меня теперь есть список таких 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# Unit тест который терпит неудачу!

[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)); 
} 

ответ

0

List<T> не отменяет Object.Equals. Таким образом, вы получаете стандартную реализацию Equals, которая является ссылочным равенством.

Чтобы проверить, соответствуют ли содержание, вам необходимо выполнить итерацию списков и сравнить каждый элемент или использовать метод Linq, упомянутый в связанном дублированном вопросе.

0

В случае модульного тестирования есть метод утилита под названием:

CollectionAssert.AreEqual(expectedList, actualList); 

что упрощает его много.

Смежные вопросы