2012-07-30 20 views
2

在我的應用程序開發中,我總結說我需要這個變量。如果我有一個詳細的數據類型有問題嗎?

IDictionary<string, IDictionary<Levels, IList<Problem>>> PackageDictionaryForProblems 
IDictionary<string, IDictionary<Levels, IList<ProblemRule>>> PackageDictionaryForProblemRules 

但因爲我需要訪問字典的每個鍵,所以這是一個痛苦。我認爲這將是一個很好的選擇,創建一個類來避免寫的所有數據類型:

public class PackageDictionaryForProblems : IDictionary<string, IDictionary<Levels, IList<Problem>>> 
{ } 

// the sane for the second dictionary 

你覺得這個怎麼樣?創建這個課程是一種很好的做法嗎?或者我需要爲每個類創建幾個類? I.E.

public class ProblemCollection : IList<Problem> 
{ } 
+0

你的代碼不會編譯,因爲你沒有實現'IDictionary'。你的意思是像'class PackageDictionaryForProblems:Dictionary >>'(也就是從'Dictionary'繼承,而不是'IDictionary')嗎? – svick 2012-07-31 05:33:42

+0

是的,你是。我忘了那一點! – 2012-07-31 15:03:14

回答

3

有像

IDictionary<string, IDictionary<Levels, IList<Problem>>> PackageDictionaryForProblems 

或定義/使用類型等

public class PackageDictionaryForProblems : IDictionary<string, IDictionary<Levels,  IList<Problem>>> 
{ } 

在沒有任何進一步的功能在PackageDictionaryForProblems限定多級集合的兩個選項之間的runtype沒有差別,它只是作爲IDictionary<string, IDictionary<Levels, IList<Problem>>>的別名。

您仍然會得到相同的內存分配,訪問時間等等。添加該自定義類型只會簡化代碼的可讀性(或不會...)個人我發現更容易查看IDictionary<string, IDictionary<Levels, IList<Problem>>>定義以瞭解數據結構,這只是個人喜好)。

0

我個人認爲沒有理由創建類別來替代一些現有的功能。

2

創建這個類是一個很好的練習嗎?

使用自定義類的主要優點,特別是在這種情況下,它的優點是可以簡化訪問。

嵌套字典訪問通常可以通過添加更高級別的成員函數來簡化,因爲「單一訪問」通常需要檢查可以添加新字典的包裝字典等。將它包裝到一個簡單的API中可以大大簡化使用的類型。

但是,如果您直接暴露底層類型,則僅使用內置類型創建此類沒有什麼優勢。

1

的三個原因,我用的是額外的類:

  1. 可讀性。
  2. 輕鬆添加額外的方法和屬性,並覆蓋
  3. 容易改變的類型(只更換基本類型,而不是狩獵在我的代碼,該代碼實例化對象的類型。
+2

4.(以'Dictionary <>'爲例)你總是需要用大小寫敏感的比較器來構造它們,有時會忘記。額外的類可以使用該比較器調用基礎構造函數。 – Tergiver 2012-07-30 22:49:33

2

我傾向於避免嵌套泛型類型不止一種深度,除非類型是基元(例如stringint)。我可能會重構,使你有從Level小號映射一個泛型類T S:

class LevelMapping<T> { 
    IDictionary<Level, T> Mapping {get; set;} 

    // constructors/methods etc 
} 

現在你可以有stringIDictionaryLevelMapping秒。

IDictionary<string, LevelMapping<Problem>> PackageDictionaryForProblems; 
IDictionary<string, LevelMapping<ProblemRule>> PackageDictionaryForProblemRules; 

這當然取決於你在這裏映射的具體細節。這可能是因爲用特殊的方法來包裝整個詞典以更好地反映你的域名(或者根本不包括它)更適合。