2013-05-17 474 views
1

有沒有一種簡單的方法可以根據它的數據爲類創建一個散列鍵? 或者一些界面呢?我有一個Dictionary<MyClass, int>如何使具有相同數據的對象具有相同的密鑰?

MyClass的是非常簡單,它包含了一個名字和一個字符串數組:

class MyClass 
{ 
    public string Name {get; private set;} 
    public string[] Attributes {get; private set; } 

    //and a constructor and some methods 
} 

現在,如果我有一個包含相同名稱的兩個MyClass實例和屬性,我需要一個解釋考慮的,如果他們有相同的鍵。

我試圖讓它成爲一個結構體,並且試圖製作一個Dictionary<string[], int>,但是所有三種情況都是相同的,即使數據相同,dicionary也會爲每個實例看到不同的鍵。

我可以使用名稱和所有參數的算法創建一個字符串鍵,並創建一個Dictionary<string, int>,但我想要更自動的東西。有沒有其他方法? 也許一個界面(這不會避免算法,但總比沒有好)。

+0

可能的重複[我們什麼時候做一個字典的GetHashCode()?](http://stackoverflow.com/questions/1407380/when-do-we-do-gethashcode-for-a-dictionary)相關:[爲什麼在重寫Equals方法時重寫GetHashCode非常重要?](http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode-when-equals-method-被覆蓋)) –

+0

「屬性」中字符串的順序是否重要?案件?是一個'null''Attributes'成員是否等於一個非空但是空的?讓這些類中的兩個「相等」並不明顯或簡單。 – dlev

+0

一切都很重要,但null屬性是不可能的。 (允許爲空) –

回答

4

您需要覆蓋Equals()GetHashCode()以按值比較實例。

+0

不錯....但是....創建一個'int'哈希將是可怕的。如此多的琴絃很可能會不夠。 'Equals()'足以使字典將它們識別爲相同嗎? –

+1

@丹尼爾:不。字典的要點是使用哈希碼爲每個對象創建一個索引。 (閱讀關於維基百科上的散列表) – SLaks

+0

對,但是,一個32字符的字符串組合肯定比32位整數組合更多。 dicionaries如何處理使用int32哈希碼的問題? –

相關問題