我有以下测试示例:
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);
变量r为true但Assert.Equal为false ...
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 }
当重写Equals并实现IEquatable时,Assert.Equal是否有任何问题?
UPDATE - 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();
}
}
答案 0 :(得分:2)
您的代码在我这边按预期工作。我只修复了编译错误 - IncludeRule
已更改为OrderRule
中的Equals
,还修复了OrderDirection
枚举成员。