Equal Collection returns false 当 Object 实现 IEquatable 时?
Equal Collection returns false when Object implements 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);
变量 r 为真但 Assert.Equal 为假 ...
OrderRule class 如下:
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 有什么问题吗?
更新 - 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();
}
}
你的代码在我这边按预期工作。我只修复了编译错误 - IncludeRule
在 Equals
中更改为 OrderRule
,还修复了 OrderDirection
枚举成员。
我有以下测试示例:
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 为真但 Assert.Equal 为假 ...
OrderRule class 如下:
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 有什么问题吗?
更新 - 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();
}
}
你的代码在我这边按预期工作。我只修复了编译错误 - IncludeRule
在 Equals
中更改为 OrderRule
,还修复了 OrderDirection
枚举成员。