BCL にはIEqualityComparerを利用できる場所がいくつかあります。Enumerable.ContainsまたはDictionary Constructorのように。デフォルトのものに満足できない場合は、比較子を提供できます。
参照しているオブジェクトがコレクションに含まれているかどうかを知りたい場合があります。他の意味で「等しい」と見なされるものではありません。
問題は、BCL にReferenceEqualsメソッドのみに依存する標準の等値比較子が存在するかどうかです。
私が自分で書いたものはこれです:
class ReferenceComparer<T> : IEqualityComparer<T> where T : class
{
private static ReferenceComparer<T> m_instance;
public static ReferenceComparer<T> Instance
{
get
{
return m_instance ?? (m_instance = new ReferenceComparer<T>());
}
}
public bool Equals(T x, T y)
{
return ReferenceEquals(x, y);
}
public int GetHashCode(T obj)
{
return RuntimeHelpers.GetHashCode(obj);
}
}
私はそれを徹底的にテストしたり、多くのシナリオを検討したりしませんでしたが、うまくいきEnumerable.Contains
、Dictionary
かなり満足しているようです.