カスタム オブジェクトの 2 つのコレクションを比較するときに、Linq の .Except() メソッドを使用するのに苦労しています。
からクラスを派生させ、 、、および演算子andのObject
オーバーライドを実装しました。メソッドも作成しました。Equals()
GetHashCode()
==
!=
CompareTo()
私の 2 つのコレクションでは、デバッグ実験として、各リスト (重複) から最初の項目を取得し、次のように比較しました。
itemListA[0].Equals(itemListB[0]); // true
itemListA[0] == itemListB[0]; // true
itemListA[0].CompareTo(itemListB[0]); // 0
3 つのケースすべてで、結果は希望どおりです。ただし、Linq の Except() メソッドを使用すると、重複したアイテムは削除されません。
List<myObject> newList = itemListA.Except(itemListB).ToList();
Linq がどのように比較を行うかを学んで、さまざまな (矛盾する?) メソッドを発見しましIEquatable<T>
たIEqualityComparer<T>
。
たとえば、から継承する場合、既にオーバーライドしたものとは異なるシグネチャを持つIEquatable<T>
新しいメソッドを提供する必要があるため、混乱しています。Equals()
署名の異なる 2 つのメソッドが必要ですか、それとも からクラスを派生させる必要はありませんObject
か?
私のオブジェクト定義(簡略化)は次のようになります。
public class MyObject : Object
{
public string Name {get; set;}
public DateTime LastUpdate {get; set;}
public int CompareTo(MyObject other)
{
// ...
}
public override bool Equals(object obj)
{
// allows some tolerance on LastUpdate
}
public override int GetHashCode()
{
unchecked
{
int hash = 17;
hash = hash * 23 + Name.GetHashCode();
hash = hash * 23 + LastUpdate.GetHashCode();
return hash;
}
}
// Overrides for operators
}
orIEquatable<T>
を使用して継承できることに気付きました。どちらかを使用すると、署名の要件が変わります。おすすめの方法は?IEquatable<MyObject>
IEquatable<object>
Equals()
私が達成しようとしていること:
コードを複製することなく、Linq (Distinct/Except) と標準の等価演算子 (==
および)を使用できるようにしたいと考えています。この比較では、2 つのオブジェクトの名前が同一で、プロパティが秒数 (ユーザー指定) の許容範囲内にある!=
場合に、これらのオブジェクトが等しいと見なされる必要があります。LastUpdate
編集:
GetHashCode()
コードを表示しています。