2013-02-07 46 views
2

我有一個HashSet。是否有一種方法可以利用IEqualityComparer來檢索傳入的對象,該對象將滿足IEqualityComparer中定義的equals方法?使用HashSet C選擇項目#

這可能會解釋更多一點。

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; 
    } 
} 
+0

你的GetHashCode應該可能返回屬性的哈希碼,而不是屬性本身 – pstrjds

+0

@pstrjds真 - 儘管在這種情況下(因爲它是一個int),這仍然可以工作。 –

+0

@ReedCopsey - 我在「最佳實踐」中更多地看待它。 – pstrjds

回答

7

如果你想檢索基於一個單一的財產項目,你可能想使用一個Dictionary<T,U>,而不是一個HashSet。然後,您可以使用MyProperty1PK作爲關鍵字將這些項目放入字典中。

你的查詢,則變得簡單:

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

既然你已經在使用它僅使用這個值作爲唯一標準,一個比較器存儲,實在是沒有缺點,只是使用屬性作爲鍵用字典代替。

+0

我同意,但似乎很奇怪有一個值的字典...存儲在鍵中,然後沒有存儲在value屬性中。這是值得考慮這樣的事情嗎? _set.Intersect(新列表 {item})。FirstOrDefault() – priehl

+0

它看起來不是,因爲這只是IEnumerable上的擴展方法...感謝您的幫助。 – priehl

+1

@priehl我會用字典' - 將道具存放在關鍵字中,並將類本身存儲在值中... –