2016-07-01 3 views
1

У меня есть следующий тестовый пример:Equal Collection возвращает false, когда Object реализует IEquatable?

var a = new List<OrderRule> { 
    new OrderRule("name", OrderDirection.Ascending), 
    new OrderRule("age", OrderDirection.Descending) 
}; 

var b = new List<OrderRule> { 
    new OrderRule("name", OrderDirection.Ascending), 
    new OrderRule("age", OrderDirection.Descending) 
}; 

var r = a.SequenceEqual(b); 
Assert.Equal(a, b); 

переменный г верен, но Assert.Equal ложна ...

Класса OrderRule является следующее:

public class OrderRule : IEquatable<OrderRule> { 

    public OrderDirection Direction { get; } 
    public String Property { get; } 

    public OrderRule(String property, OrderDirection direction) { 
    Direction = direction; 
    Property = property; 
    } 

    public Boolean Equals(OrderRule other) { 
    if (other == null) 
     return false; 
    return Property.Equals(other.Property) && Direction.Equals(other.Direction); 
    } 

    public override Boolean Equals(Object obj) { 
    if (ReferenceEquals(null, obj)) 
     return false; 
    if (ReferenceEquals(this, obj)) 
     return true; 
    if (obj.GetType() != GetType()) 
     return false; 
    return Equals(obj as IncludeRule); 
    } 

    public override Int32 GetHashCode() { 
    return HashCode.Of(Property).And(Direction); 
    } 
} 

public enum OrderDirection { ASC, DESC } 

Есть любая проблема с Assert.Equal при переопределении Equals и реализации IEquatable?

ОБНОВЛЕНИЕ - HashCode помощник

public struct HashCode { 

    private readonly Int32 Value; 

    private HashCode(Int32 value) { 
    Value = value; 
    } 

    public static implicit operator Int32(HashCode hashCode) { 
    return hashCode.Value; 
    } 

    public static HashCode Of<T>(T item) { 
    return new HashCode(GetHashCode(item)); 
    } 

    public HashCode And<T>(T item) { 
    return new HashCode(CombineHashCodes(Value, GetHashCode(item))); 
    } 

    public HashCode AndEach<T>(IEnumerable<T> items) {  
    Int32 hashCode = items.Select(x => GetHashCode(x)).Aggregate((x, y) => CombineHashCodes(x, y)); 
    return new HashCode(CombineHashCodes(Value, hashCode)); 
    } 

    private static Int32 CombineHashCodes(Int32 x, Int32 y) { 
    unchecked {   
     return ((x << 5) + x)^y; 
    } 
    } 

    private static Int32 GetHashCode<T>(T item) { 
    return item == null ? 0 : item.GetHashCode(); 
    } 

} 
+1

Ваш код работает так, как ожидается, на моей стороне (только исправленные компиляции erros - 'IncludeRule' изменены на' OrderRule' в 'Equals' +' OrderDirection' перечисления членов) –

+0

Ах, упустил это! Damm Copy Right ... Не могли бы вы добавить свое объяснение в качестве ответа, чтобы я отметил его? –

ответ

2

Ваш код работает, как ожидалось на моей стороне. Я только фиксировал компиляцию erros - IncludeRule изменен на OrderRule в Equals, также исправлен OrderDirection перечислены члены.

+0

Я изменил GetHashCode на ваш код, и он не сработал. Кстати, я просто добавил помощника GetHashCode. Вы видите там что-то не так? Но так или иначе, я не пробовал ваш код. –

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