2

私はハッシュセットを持っています。IEqualityComparer で定義された equals メソッドを満たすオブジェクトを渡すアイテムを取得するために IEqualityComparer を利用できるメソッドはありますか?

これでもう少し説明がつくかもしれません。

    public class Program
{
    public static void Main()
    {
        HashSet<Class1> set = new HashSet<Class1>(new Class1Comparer());
        set.Add( new Class1() { MyProperty1PK = 1, MyProperty2 = 1});
        set.Add( new Class1() { MyProperty1PK = 2, MyProperty2 = 2});

        if (set.Contains(new Class1() { MyProperty1PK = 1 }))
            Console.WriteLine("Contains the object");

        //is there a better way of doing this, using the comparer?  
        //      it clearly needs to use the comparer to determine if it's in the hash set.
        Class1 variable = set.Where(e => e.MyProperty1PK == 1).FirstOrDefault();

        if(variable != null)
            Console.WriteLine("Contains the object");
    }
}

class Class1
{
    public int MyProperty1PK { get; set; }
    public int MyProperty2 { get; set; }
}

class Class1Comparer : IEqualityComparer<Class1>
{
    public bool Equals(Class1 x, Class1 y)
    {
        return x.MyProperty1PK == y.MyProperty1PK;
    }

    public int GetHashCode(Class1 obj)
    {
        return obj.MyProperty1PK;
    }
}
4

1 に答える 1

7

単一のプロパティに基づいてアイテムを取得する場合は、ハッシュセットのDictionary<T,U>代わりに を使用することをお勧めします。次に、キーとして使用して、項目をディクショナリ内に配置できMyProperty1PKます。

クエリは簡単になります。

Class1 variable;
if (!dictionary.TryGetValue(1, out variable)
{
  // class wasn't in dictionary
}

この値のみを一意性の基準として使用する比較子を使用して既に保存していることを考えると、代わりにそのプロパティを辞書のキーとして使用することに実際に不利な点はありません。

于 2013-02-07T19:10:49.727 に答える