Equalsメソッドをオーバーライドしない(参照 - 重要ですか?) MyType型がある場合、 ICollection<MyType>にその型の特定のインスタンスが含まれているかどうかを判断するときに、どのヒューリスティックが使用されますか?
独自のヒューリスティックを使用する最良の方法は何ですか (たとえば、Idプロパティ値が等しいかどうかを確認します)?
Equalsメソッドをオーバーライドしない(参照 - 重要ですか?) MyType型がある場合、 ICollection<MyType>にその型の特定のインスタンスが含まれているかどうかを判断するときに、どのヒューリスティックが使用されますか?
独自のヒューリスティックを使用する最良の方法は何ですか (たとえば、Idプロパティ値が等しいかどうかを確認します)?
この型は Equals をオーバーライドしないため、Equals のデフォルトの実装、つまり参照の等価性が使用されます。したがって、コレクションにまさにそのインスタンスが含まれている場合、Contains は true になります。
独自の比較を使用するには、実装IEqualityComparer<T>
(ID の比較など) を行い、比較子のインスタンスを Contains メソッドに渡します。ICollection<T>.Contains
(これは、「ネイティブ」メソッドに IEqualityComparer オーバーロードがないため、LINQ 拡張機能を使用できることを前提としています。)
によって定義されていませんICollection<T>
-異なる実装では異なるメソッドを使用できます。MSDNから:
オブジェクトの等価性を判断する方法は実装によって異なります。たとえば、
List<T>
を使用 しますがComparer<T>.Default
、 キーの比較に使用する実装をDictionary<TKey, TValue>
ユーザーが指定できるようにしますIComparer<T>
ほとんどの場合、参照を比較するだけ ICollection<T>
ですが、使用している特定のドキュメントを確認する必要があります。
私の知る限り、参照(メモリ内のアドレス)が比較されます...
参照が十分でない場合は、前述のように ID を比較できます。
MSDNによると:
オブジェクトの等価性を判断する方法は実装によって異なります。たとえば、List<(Of <(T>)>) は Comparer<(Of <(T>)>)..::.Default を使用しますが、Dictionary<(Of <(TKey, TValue>)>) はユーザーを許可しますキーの比較に使用する IComparer<(Of <(T>)>) 実装を指定します。
自分でそれを行う最善の方法は、IEqualityComparer<T>
public class MyComparer : IEqualityComparer<MyType>
{
public bool Equals(MyType x, MyType y)
{
return x.Id == y.Id;
}
public int GetHashCode(MyType obj)
{
return obj.Id.GetHashCode();
}
}