2014-04-15 227 views
2

我不明白爲什麼沒有一個本地函數來做到這一點。假設我創建了以下類:通過hashcode獲取對象

public class Student { 
    public string Name {get; set;} 
    public override int GetHashCode() { 
     return(Name.GetHashCode()); 
    } 
} 

之後,我創建一個包含了一些學生的HashSet。現在我想用他的名字從HashSet找一個學生,這個名字也是使用的哈希碼,沒有列舉。這可能嗎?如果是這樣,我該如何做到這一點?由於學生的姓名被用作哈希碼,因此應該可以使用O(1)操作,對嗎?

+0

使用HashSet.Contains()。這是攤銷O(1)。 –

+1

使用'字典<字符串,學生>',你可以得到'myDictionary [「name」]' –

+0

@ Siriam的值我想這可以工作,但它會產生一致性問題。如果字典的關鍵字與對象的名稱不同,該怎麼辦?如果沒有其他的解決辦法,我想我必須解決這個解決方案。謝謝! –

回答

3

而不是使用HashSet(或字典)來存儲您的學生使用KeyedCollection來代替。

public class StudentCollection : KeyedCollection<string, Student> 
{ 
    protected override string GetKeyForItem(Student item) 
    { 
     return student.Name; 
    } 
} 

這將讓你的名字迅速做查找就像一個字典,但你並不需要手動配對名稱與當你插入鑰匙。但請注意,沒有兩個學生可以使用相同的名稱,否則會出現錯誤(就像您使用詞典並使用兩名同名學生一樣)。

+0

實際上不是數組的數組。 IIRC,它是一系列鏈表(或者類似於鏈表),無論如何。 –

+0

我大大簡化了我的答案,如果您想了解更多關於HashSet的工作原理,請查看修訂歷史記錄。 –

+0

這似乎正是我要找的!現在就去測試它,如果它看起來一樣好,可能會選擇這個答案! –

5

哈希碼是而不是唯一標識符。不同的對象可能具有相同的哈希碼。哈希碼的唯一要求是被認爲相等的對象具有相同的哈希碼。

如果您需要O(1)基於密鑰檢索項目,請使用Dictionary<TKey, TValue>而不是HashSet<T>

+0

哈希碼確實是一個標識符。事實上,我可以通過比較哈希代碼來檢查我的'HashSet '中是否存在項目... – Haney

+0

由於密鑰取決於值的屬性,KeyedCollection會比字典更好。 –

+1

@DavidHaney哈希碼沒有 - 也不能 - 唯一標識一個項目。 –