从LinkedList <t> </t>中快速删除项目

时间:2012-08-31 08:44:05

标签: c# .net collections

我有以下链接列表:

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拳击和拆箱并使用后者 - 更快 - 接近?

感谢。

2 个答案:

答案 0 :(得分:4)

您需要使用元素类型来实现IEquatable<T>接口:

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

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

答案 1 :(得分:2)

LinkedList<T>.Remove使用LinkedList<T>.Find查找要删除的元素,LinkedList<T>.Find使用default equality comparer执行比较,在您的情况下,基于{的等式比较器{1}}。

来自MSDN:

  

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

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