2009-04-16 14 views
2

我想要做的是有一個項目明智的靜態字典,所以我可以從我的代碼中的任何地方訪問單個列表。作爲一個常見的靜態列表的StringDictionary?

到現在爲止,我想出了這個解決方案,一個公共靜態類的公共屬性:

public static class Common 
{ 
    public static StringDictionary Domains 
    { 
     get 
     { 
      StringDictionary list = new StringDictionary(); 

      list.Add("212", "Location A"); 
      list.Add("555", "Location B"); 
      list.Add("747", "Location C"); 
      list.Add("000", "Location D"); 

      return list; 
     } 
    } 
} 

那我以這種方式(我用它來替換單元格的內容在GridView ):

if (Common.Domains.ContainsKey(e.Row.Cells[5].Text)) 
{ 
    e.Row.Cells[5].Text = Common.Domains[e.Row.Cells[5].Text]; 
} 
else 
{ 
    e.Row.Cells[5].Text = "n/a"; 
} 

但我不知道這是否是一個有效的解決方案,和/或是否有其他(更好)的方式來做到這一點...有人可以給一個暗示?

在此先感謝安德烈。

+0

編輯:我發現了一些關於Dictionary vs StringDictionary的討論,Dictionary 對我來說也是可行的(但它與問題無關)。 – Albireo 2009-04-16 15:47:52

回答

3

您可能不想在每次訪問該屬性時重新創建列表。將構造移到靜態構造函數中:

public static class Common 
{ 
    private static StringDictionary _domains; 
    static Common() 
    { 
     _domains = new StringDictionary(); 
     _domains.Add("212", "Location A"); 
     _domains.Add("555", "Location B"); 
     _domains.Add("747", "Location C"); 
     _domains.Add("000", "Location D"); 
    } 
    public static StringDictionary Domains 
    { 
     get 
     { 
      return _domains; 
     } 
    } 
} 

而且您應該知道,返回的字典不是隻讀的。所以這個類的客戶可以修改集合(例如添加/刪除一些條目)。

+0

你擊敗了我寫的例子.. – 2009-04-16 15:50:03

+0

感謝您的回覆馬丁,這正是我一直在尋找! – Albireo 2009-04-16 15:55:14

0

你的字典是要你每次做Domains

配置靜態構造函數將加載在內存藏匿list實例字典的只讀靜態副本有時間重新加載。

0

考慮使用Singleton模式來代替:

http://en.wikipedia.org/wiki/Singleton_pattern

這不是必須的,因爲每一個節目都有自己的特殊需求,我只推薦你閱讀這種模式,並再次重新考慮你的設計。

如果你的程序是多線程的,你可能想檢查一下StringDictionary是否是線程安全的,如果它不是線程安全的(並且你的程序是多線程的),你應該爲你的類添加一些同步機制。

0

@Jeff Fritz在他的回答中是正確的,但我只是想多加一些關於這個字段在多個線程中的共享訪問。 StringDictionary僅對讀取操作是線程安全的,而不是寫入操作,因此您需要小心,不要在沒有正確鎖定的情況下修改此集合,並且您還需要在迭代集合時鎖定集合。

要遍歷:

lock(Common.Domains) { 
    foreach(var domain in Common.Domains) { 
    } 
} 

添加域靜態構造函數:

lock(Common.Domains) { 
    Common.Domains.Add("111", "Location 3"); 
} 

一般情況下,通過一個共享的非只讀集合時,我會很小心靜態字段,以便該字段不被修改。你可能想使 StringDictionary一個 ReadOnlyCollection,而不是和紀念場「只讀」:

public static readonly ReadOnlyCollection<Pair<string, string>> domains 

你不會得到O(1)查找,但我假設這個集合會很小,所以這無關緊要。

相關問題