我有以下链接列表:
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
拳击和拆箱并使用后者 - 更快 - 接近?
感谢。
答案 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>
使用。