2009-05-04 69 views
13

枚舉類型更快/更有效比字符串類型當用作字典鍵?哪一個更快/更高效:Dictionary <字符串,對象>或字典<enum,object>?

IDictionary<string,object> or IDictionary<enum,object> 

事實上,哪種數據類型最適合作爲字典鍵,爲什麼?

考慮以下幾點:注:僅5個屬性爲簡單起見

struct MyKeys 
{ 
    public string Incomplete = "IN"; 
    public string Submitted = "SU"; 
    public string Processing="PR"; 
    public string Completed = "CO"; 
    public string Closed = "CL"; 
} 

enum MyKeys 
{ 
    Incomplete, 
    Submitted, 
    Processing, 
    Completed, 
    Closed 
} 

如果用作字典中的按鍵,上面會更好!

+0

C#是否具有與Java的EnumMap相同的功能? – 2009-05-04 13:56:43

回答

13

當然,enum版本更好(當然兩者都適用並且有意義)。不僅僅是爲了性能(它可能會更好或更糟糕,請參閱Rashack的非常好的評論),因爲它檢查編譯時間並得到更清晰的代碼。

您可以通過使用Dictionary<int, object>並將enum鍵轉換爲int或指定自定義比較器來繞過比較問題。

+9

性能方面可能並不真實(令人驚訝) - http://ayende.com/Blog/archive/2009/02/21/dictionaryltenumtgt-puzzler.aspx – Rashack 2009-05-04 13:59:21

+1

您可以隨時指定您自己的比較器。這不是字典或枚舉的問題,但比較器 – 2009-05-04 14:01:37

5

我認爲你應該從關注正確性開始。這比你的程序中可能出現的次要性能差異之間的最小差異要重要得多。在這種情況下,我會專注於您的類型的適當表示(枚舉似乎是最好的)。然後稍後在配置文件中查看您的應用程序,如果有問題,那麼只有在那時您才應該修復它。

在過程的後期更快地製作代碼通常是一個簡單的過程。採取skolima提供的鏈接。如果您選擇了枚舉,那麼在應用程序中刪除潛在的性能問題可能需要大約10分鐘的修復時間。我想在這裏強調這個詞。對於NHibernate來說,這絕對是一個問題,但是對於你的程序是否會有問題,完全取決於它的用途。

另一方面,在後面的過程中使代碼更加正確會變得更加困難。在一個足夠大的問題中,你會發現人們開始依賴前面不良行爲的副作用。這可以在不破壞其他組件的情況下更正代碼。

1

可能並不適用,但...

注意,枚舉是compiledconstants這可能導致引用該枚舉如果改變了所有組件的重新部署。 (即該常量在編譯時被硬編碼到所有使用它的程序集中)。

-1

我猜測枚舉版本更快。在引擎蓋下,字典引用hashcode的一切。我的猜測是,爲字符串生成散列碼會更慢。但是,這可能會慢得多,而且肯定比字符串比較更快。我同意那些說enum更清潔的其他海報。

相關問題