2

我有以下链表:

LinkedList<Segment> myList = new LinkedList<Segment>();

为什么当我这样做时:

myList.Remove(new Segment(4,8));

调用以下Segment.Equals()方法:

class Segment
{
   ...

   public override bool Equals(object obj)
   {                         
      return Equals((Segment)obj);
   }

}

而不是这个:

class Segment
{
   ...

   public bool Equals(Segment other)
   {                        
      return other.V1 == V1 && other.V2 == V2;
   }     
}

有没有办法跳过object装箱和拆箱并使用后者 - 更快 - 方法?

谢谢。

4

2 回答 2

4

你需要你的元素类型来实现IEquatable<T>接口:

class Segment : IEquatable<Segment>
{
    // ...

    public bool Equals(Segment other)
    {                        
        return 
            (object)other != null &&
            other.V1 == V1 && 
            other.V2 == V2;
    }     
}
于 2012-08-31T09:01:20.677 回答
2

LinkedList<T>.Remove用于LinkedList<T>.Find查找要删除的元素,并LinkedList<T>.Find使用默认的相等比较器来执行比较,在您的情况下是基于Object.Equals.

来自 MSDN:

Default属性检查类型T是否实现了System.IEquatable <T>接口,如果是,则返回使用该实现的EqualityComparer<T> 。否则,它返回一个使用 T提供的Object.EqualsObject.GetHashCode覆盖的EqualityComparer<T >

通过实现IEquatable<T>接口,您可以提供自己的相等实现,然后由LinkedList<T>.

于 2012-08-31T09:01:14.950 回答