1. ホーム
  2. .net

[解決済み] IEqualityComparerでデリゲートをラップする

2022-07-11 10:28:13

質問

いくつかのLinq.Enumerable関数は、Linq.Enumerableを使用するために IEqualityComparer<T> . を適応させる便利なラッパークラスはありますか? delegate(T,T)=>bool を実装するために IEqualityComparer<T> ? 正しいハッシュコードの定義の問題を無視すれば)書くのは十分簡単ですが、すぐに使えるソリューションがあるかどうか知りたいのです。

具体的には、私はセット操作を Dictionary に対してセット操作を行い、メンバーシップを定義するためにキーのみを使用したいのです(異なるルールに従って値を保持しながら)。

どのように解決するのですか?

通常であれば、回答に@Samとコメントすることで解決します(元の投稿に編集を加えて、動作を変えずに少しすっきりさせました。)。

以下は、私のリフである @Sam さんの回答 に、デフォルトのハッシュ化ポリシーに対する[IMSHO]重要な修正を加えました。

class FuncEqualityComparer<T> : IEqualityComparer<T>
{
    readonly Func<T, T, bool> _comparer;
    readonly Func<T, int> _hash;

    public FuncEqualityComparer( Func<T, T, bool> comparer )
        : this( comparer, t => 0 ) // NB Cannot assume anything about how e.g., t.GetHashCode() interacts with the comparer's behavior
    {
    }

    public FuncEqualityComparer( Func<T, T, bool> comparer, Func<T, int> hash )
    {
        _comparer = comparer;
        _hash = hash;
    }

    public bool Equals( T x, T y )
    {
        return _comparer( x, y );
    }

    public int GetHashCode( T obj )
    {
        return _hash( obj );
    }
}