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;
}
}