我有以下内容:
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);
Run Code Online (Sandbox Code Playgroud)
即使两个列表包含彼此相等的项,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);
}
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
检查两个列表是否相等并不意味着检查它们是否包含相同的项目.
如果你这样做:
var a = new List<OrderRule>();
var b = new List<OrderRule>();
var r = a.Equals(b); //false
Run Code Online (Sandbox Code Playgroud)
r即使两个列表中包含相同的项目,也将始终为false.那是因为你没有检查列表的内容.你实际上是在检查两者是否a并b引用同一个对象.但是a是一个对象,b而另一个对象.
如果你这样做,那r将是真的:
var a = new List<OrderRule>();
var b = a;
var r = a.Equals(b) //true
Run Code Online (Sandbox Code Playgroud)
如果您有两个列表,并且想要查看它们是否包含相同顺序的相同项目,则可以执行以下操作:
var r = a.SequenceEquals(b);
Run Code Online (Sandbox Code Playgroud)
在你的问题的例子r会true因为你是压倒一切Equals的OrderRule,所以在一个列表中的项目被认为是"平等"在其他的项目.
知道了 - 您的平等签到OrderRule被打破了.
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);
}
Run Code Online (Sandbox Code Playgroud)
我想而不是return Equals(obj as IncludeRule)你的意思return Equals(obj as OrderRule).
| 归档时间: |
|
| 查看次数: |
1418 次 |
| 最近记录: |