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.EqualsおよびObject.GetHashCodeのオーバーライドを使用するEqualityComparer < T >返します

インターフェイスを実装することによりIEquatable<T>、によって使用される同等性の独自の実装を提供できますLinkedList<T>

于 2012-08-31T09:01:14.950 に答える