具有相同元素的两个列表不相等.为什么?

Mig*_*ura 4 .net c#

我有以下内容:

  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)

我错过了什么?

Sco*_*nen 7


检查两个列表是否相等并不意味着检查它们是否包含相同的项目.

如果你这样做:

var a = new List<OrderRule>();
var b = new List<OrderRule>();
var r = a.Equals(b); //false
Run Code Online (Sandbox Code Playgroud)

r即使两个列表中包含相同的项目,也将始终为false.那是因为你没有检查列表的内容.你实际上是在检查两者是否ab引用同一个对象.但是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)

在你的问题的例子rtrue因为你是压倒一切EqualsOrderRule,所以在一个列表中的项目被认为是"平等"在其他的项目.


知道了 - 您的平等签到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).