IEqualityComparer ラムダ式で実装
Dictionry.Constantsでラムダ受け付けてほしい
IEqualityComparerとかめんどい - Memo+を拡張メソッドに改変
/// <summary> /// ラムダ式を受け付けるIEqualityComparerの実装を提供します。 /// </summary> /// <typeparam name="T">比較するオブジェクトの型。</typeparam> static public class LambdaComparer { /// <summary> /// 既定の等値比較子を使用して、指定した要素がシーケンスに含まれているかどうかを判断します。 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="source">値の検索対象となるシーケンス。</param> /// <param name="value">シーケンス内で検索する値。</param> /// <param name="lambdaComparer">比較を行うためのラムダ式。</param> /// <returns>指定した値を持つ要素がソース シーケンスに含まれている場合は true。それ以外は false。</returns> public static bool ContainsLamda<T>( this IEnumerable<T> source, T value, Func<T, T, bool> lambdaComparer ) { return source.Contains( value, new LambdaComparerInstance<T>( lambdaComparer ) ); } } class LambdaComparerInstance<T> : EqualityComparer<T> { private readonly Func<T, T, bool> _lambdaComparer; private readonly Func<T, int> _lambdaHash; /// <summary> /// LambdaComparer<T> クラスの新しいインスタンスを初期化します。 /// </summary> /// <param name="lambdaComparer"></param> public LambdaComparerInstance( Func<T, T, bool> lambdaComparer ) : this( lambdaComparer, o => 0 ) { } /// <summary> /// LambdaComparer<T> クラスの新しいインスタンスを初期化します。 /// </summary> /// <param name="lambdaComparer">比較用のラムダ式。</param> /// <param name="lambdaHash">ハッシュ用のラムダ式。</param> public LambdaComparerInstance( Func<T, T, bool> lambdaComparer, Func<T, int> lambdaHash ) { if ( lambdaComparer == null ) { throw new ArgumentNullException( "lambdaComparer" ); } if ( lambdaHash == null ) { throw new ArgumentNullException( "lambdaHash" ); } _lambdaComparer = lambdaComparer; _lambdaHash = lambdaHash; } /// <summary> /// T 型の 2 つのオブジェクトが等しいかどうかを確認します。 /// </summary> /// <param name="x">比較対象の第 1 オブジェクト。</param> /// <param name="y">比較対象の第 2 オブジェクト。</param> /// <returns>指定したオブジェクトが等しい場合は true。それ以外の場合は false。</returns> public override bool Equals( T x, T y ) { return _lambdaComparer( x, y ); } /// <summary> /// ハッシュ アルゴリズムや、ハッシュ テーブルなどのデータ構造体の指定したオブジェクトに使用するハッシュ関数として機能します。 /// </summary> /// <param name="obj">ハッシュ コードを取得する対象となるオブジェクト。</param> /// <returns>指定したオブジェクトのハッシュ コード。</returns> public override int GetHashCode( T obj ) { return _lambdaHash( obj ); } }
usage
Dictionary<int, string> dic; dic.Values.ContainsLamda( "aa", ( a, b ) => { return a == b; } );