C# 从LinkedList中快速删除项目<;T>;

C# 从LinkedList中快速删除项目<;T>;,c#,.net,collections,C#,.net,Collections,我有以下链接列表: LinkedList<Segment> myList = new LinkedList<Segment>(); 调用以下段.Equals()方法: class Segment { ... public override bool Equals(object obj) { return Equals((Segment)obj); } } 而不是这个: class

我有以下链接列表:

LinkedList<Segment> myList = new LinkedList<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;
   }     
}
是否有任何方法可以跳过对象的装箱和拆箱,并使用后一种更快速的方法

谢谢。

LinkedList.Remove
使用
LinkedList.Find
查找要删除的元素,而
LinkedList.Find
使用执行比较,在您的情况下,它是基于
对象的相等比较器。Equals

从MSDN:

Default属性检查类型T是否实现接口,如果实现,则返回使用该实现的。否则,它将返回使用T的重写并由T提供的


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

使用
IEquatable
接口需要您的元素类型:

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

    public bool Equals(Segment other)
    {                        
        return 
            (object)other != null &&
            other.V1 == V1 && 
            other.V2 == V2;
    }     
}
类段:i可满足
{
// ...
公共布尔等于(其他段)
{                        
返回
(对象)其他!=null&&
other.V1==V1&&
其他2.V2==V2;
}     
}

索引线和段之间有什么联系?IndexLine是一个基本抽象类吗?也许对我来说现在还太早,但是
是一个引用类型-装箱发生在哪里?可能是因为它是一个“覆盖问题”而不是“装箱问题”?@ken2k:对不起,在简化代码时,我忘了重命名它。“对象”调用版本是因为
未实现
IEquatable
。在任何情况下,正如Graham Clark所说,这里没有装箱,因为
,而不是
结构
。不要将静态键入作为
对象
与装箱混淆。您确定没有遇到堆栈溢出吗?而是使用
.ReferenceEquals
检查空值!相等和不相等运算符(
=
!=
)始终执行引用相等检查,除非所述运算符被实现的类显式重写(如
字符串
)。您可以参考MSDN示例,它也使用
other==null
。我知道,我只是认为明确使用
.ReferenceEquals
更为清晰。如果有人实现他/她自己的
.Equals
,则重写相等运算符的可能性非常高。否则,应该使用
IEqualityComparer
(如果适用)。顺便说一句,当涉及到设计时,您的msdn条目()真的很糟糕。。。谁,以上帝的名义,以如此复杂的方式实现平等链?!公平地说,尽管在重写
==
时重写
=
被认为是一种不好的做法,但前者只应在不可变类型中被重写。我已经向
对象
引入了类型转换,以确保引用相等。
class Segment : IEquatable<Segment>
{
    // ...

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