【发布时间】:2016-07-01 18:08:50
【问题描述】:
我有以下几点:
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.Equals(b);
即使两个列表包含彼此相等的项目,r 变量也是假的。 OrdeRule 类实现了 IEquality。请注意,当 Direction 和 Property 都相等时,两个 OrderRules 相等。
public enum OrderDirection { ASC, DESC }
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);
}
}
我错过了什么?
【问题讨论】:
-
List<T>不会覆盖Equals,基本上 - 就这么简单。 -
List<T>没有实现IEquality也没有覆盖Equals和GetHashCode,所以这是一个参考比较。您可能想改用Enumerable.SequenceEqual。 -
我在 XUnit 上使用它,使用 Assert.Equal(orderRule1, orderRule2);但不是在使用 Assert.Equal(orderRuleList1, orderRuleList2); ...我想我需要实现一个比较器? Assert.Equal 接受一个比较器......我只是想避免这种情况,因为我需要复制我在 Equals 中已有的代码。还有其他选择吗?
-
你应该阅读这个问题然后stackoverflow.com/questions/419659/…
-
@MiguelMoura 也许是版本问题?我从未使用过 XUnit,而且我总是需要使用类似
Enumerable.SequenceEqual或CollectionAssert.AreEqual的东西