2013-05-05 2 views
-2

У меня есть этот C# классвложенная Список сравнения Равно

public class EntryClass 
    { 
     public string Field { get; set; } 
     public List<FieldKeyValuePair<string, string>> FieldKeyValPairs { get; set; } 

     public bool Equals(EntryClass other) 
     { 
      return Field.Equals(other.Field) 
       && FieldKeyValPairs.Equals(other.FieldKeyValPairs); 
     } 

     public override bool Equals(object obj) 
     { 
      if (ReferenceEquals(null, obj)) return false; 
      if (ReferenceEquals(this, obj)) return true; 
      if (obj.GetType() != this.GetType()) return false; 
      return Equals((EntryClass)obj); 

     } 
    } 

    public class FieldKeyValuePair<K, V> 
    { 
     public K Key { get; set; } 
     public V Value { get; set; } 

     public bool Equals(FieldKeyValuePair<K, V> other) 
     { 
      return Key.Equals(other.Key) 
       && Value.Equals(other.Value); 
     } 

     public override bool Equals(object obj) 
     { 
      if (ReferenceEquals(null, obj)) return false; 
      if (ReferenceEquals(this, obj)) return true; 
      if (obj.GetType() != this.GetType()) return false; 
      return Equals((FieldKeyValuePair<K, V>)obj); 
     } 

    } 

пытается сделать Assert.IsTrue(expected.SequenceEqual(actual)); всегда дает мне ложь, я вижу, что даже тогда, когда ожидается и фактической имеет те же FieldKeyValPairs это выражение всегда поражает ложные && FieldKeyValPairs.Equals(other.FieldKeyValPairs);

EDIT и ожидаемый и Actual имеет тип

List<EntryClass> expected = new List<EntryClass>(); // TODO: 
     List<EntryClass> actual = new List<EntryClass>(); 
+0

Он объясняет достаточно хорошо, но проблема форматирования. Его проблема описана в конце образца кода, который он предоставил. – Lynch

+0

@IAbstract обновил вопрос –

ответ

0

мне пришлось изменить возврата Field.Equals (other.Field) & & FieldKeyValPairs.Equals (other.FieldKeyValPairs);

К

 return Field.Equals(other.Field) 
      && FieldKeyValPairs.SequenceEqual(other.FieldKeyValPairs); 
2

Может быть, вы просто забыли переопределить GetHashCode(). Некоторые алгоритмы сравнения сначала сравнивают хэш-код, чтобы ускорить вычисление.

Смотрите этот ответ для получения дополнительной информации: Why is it important to override GetHashCode when Equals method is overridden?

+0

Я забыл, что добавил, но все же заметил, что при возврате Field.Equals (other.Field) && FieldKeyValPairs.Equals (other.FieldKeyValPairs); Выполняет это, не попадает на переопределение равных для этого класса FieldKeyValPairs –

+0

@Justin. Вы должны добавить дополнительные модульные тесты для независимого тестирования каждого метода. Может быть, вы можете начать с тестирования функции FieldKeyValuePair.Equals напрямую, вместо того, чтобы тестировать их через сравнение списка. – Lynch

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