2012-02-08 119 views
3

在C#我需要保持數據在一個字典對象,看起來像:使用一個字典<串,對象>作爲字典<字符串,字典<字符串,字符串>>

Dictionary<string, Dictionary<string, string>> MyDict = 
    new Dictionary<string, Dictionary<string, string>>(); 

現在我意識到,在某些情況下,我需要一些其他的(不是字典式的)數據作爲主字典的值。

是否有任何問題或限制,如果我只是實例的主要字典。如:

Dictionary<string, object> MyDict = new Dictionary<string, object>(); 

物場我可以把字符串,字典,無論..

由於提前, 最好的問候,史蒂芬

+0

標題您的問題 – vulkanino 2012-02-08 16:12:55

+0

我不會」的文中不符我認爲這將是一個問題。您可能只需要將其轉換爲訪問它時應該使用的內容即可。 – Kevin 2012-02-08 16:13:51

+0

你可以看到這個問題的答案http://stackoverflow.com/questions/569903/multi-value-dictionary是你想要的嗎? – DotNetUser 2012-02-08 16:14:31

回答

1

通過使用對象爲在你的字典值時,您將承擔一定的風險和併發症:

  • 缺乏類型安全的(什麼都可以設置爲值)
  • 你將不得不轉換爲特定類型,可能基於值

您應該重新考慮您的設計。但是,如果你真的想要一個靈活性,你可以創建一個新的類型,作爲值類型。喜歡的東西:

class MySpecialType 
{ 
    public Dictionary<string, string> MyStringDictionary { get; set; } 
    public string MyStringVal {get; set;} 

    public Type ActiveType { get; set; } // property would specify the current type 
    // ... 

你的主詞典聲明會再看看這樣的:

Dictionary<string, MySpecialType> MyDict = new Dictionary<string, MySpecialType>(); 

您可以使用ActiveType財產或創造條件,指定類型的枚舉。您也可以在類中使用靜態實用功能,以幫助您返回正確的實例和類型...

+0

你的答案與其他人的知識相結合對我來說最合適。 (感謝那!) 在這種情況下,「缺少類型安全性(任何可設置的值)」對我來說都是一個特性:D 您對類的解決方案很有意義,但有點像我試圖避免的開銷我。 如此解決,多虧了所有,我的主要問題是代碼的上下文和設計。 ***感謝*** – N471v3 2012-02-08 16:47:27

0

沒有,有沒有問題。如果你需要輸入值爲Dictionary<string, string>,那麼只需施放它,你就能解決這個問題。

5

是的,你的字典裏就沒有強類型化了 - 你可以不喜歡第一種方法:

string value = myDict["foo"]["bar"]; 

在第二種方法,這是不可能的了,因爲你要投第一:

string value = ((Dictionary<string,string>)myDict["foo"])["bar"]; 

這聽起來像你的問題可以用更好的設計方法解決。通常需要通過重新設計解決方案來避免在同一數據結構中存儲不同類型的對象 - 因此爲什麼需要這樣做?

編輯:

如果你只是想處理null值,你可能只是這樣做:

string value = myDict["foo"] != null ? myDict["foo"]["bar"] : null; 

或者包裹在一個擴展方法:

public static T GetValue<T>(this Dictionary<T, Dictionary<T,T>> dict, 
          T key, T subKey) where T: class 
{ 
    T value = dict[key] != null ? dict[key][subKey] : null; 
    return value; 
} 

string value = myDict.GetValue("foo", "bar"); 
+0

因爲這實現了大約1000行代碼,並且在某些情況下,需要使用null添加值,其中密鑰用作數據。 like: MyDict.Add(「One_key」,AnotherDictionary); MyDict.Add(「Cool_key」,null); than for循環: if(MyDict.value!= null) //做某事 而你的觀點是對的,設計也許有點錯誤!但是現在我需要數據的關鍵字和值域,並且認爲我不想爲這些具有值null的鍵值對生成一個子字典,因爲代碼開銷,如果您知道我的意思。 (許多空值的條目) – N471v3 2012-02-08 16:24:58

+0

謝謝大家的快速和好回答! – N471v3 2012-02-08 16:27:40

0

好,你的代碼會更少類型安全,你需要運行時類型檢查和類型轉換,否則你可以使用object作爲字典值類型並存儲任何類型。

1

你會失去強大的類型和所有的好處。

你能不能創建一個具有解釋性質的新類和添加其他數據吧:

public class CallItWhatYouLike 
{ 
    public Dictionary<string, string> Dictionary {get; set;} 
    public int AnotherProperty {get; set;} 
    ... 
} 

var MyDict = new Dictionary<string, CallItWhatYouLike>(); 
0

你會付出性能上的損失,當你unboxSystem.Object,但除此之外,有ISN」除了索引器過度投射外(由於輸入較弱,),您的方法存在問題。

如果您使用的是.NET 4,則可以考慮使用System.Tuple

4

您可以這樣做。從主詞典中檢索數據後,您必須將結果強制轉換爲適當的類型:

object obj; 
If(mainDict.TryGetValue("key", out obj)) { 
    var dict = obj as Dictionary<string, string>>; 
    if (dict != null) { 
     // work with dict 
    } else { 
     var value = obj as MyOtherType; 
     .... 
    } 
} 

但是請注意,這不是類型安全的;即編譯器只能根據object類型的值僅部分檢查代碼的有效性。


或者你可以嘗試更多的面向對象的解決方案

public abstract class MyBaseClass 
{ 
    public abstract void DoSomething(); 
} 

public class MyDictClass : MyBaseClass 
{ 
    public readonly Dictionary<string, string> Dict = new Dictionary<string, string>(); 

    public override void DoSomething() 
    { 
     // So something with Dict 
    } 
} 

public class MyTextClass : MyBaseClass 
{ 
    public string Text { get; set; } 

    public override void DoSomething() 
    { 
     // So something with Text 
    } 
} 

然後宣佈你的主詞典與

var mainDict = new Dictionary<string, MyBaseClass>(); 

mainDict.Add("x", new MyDictClass()); 
mainDict.Add("y", new MyTextClass()); 

... 

MyBaseClass result = mainDict[key]; 
result.DoSomething(); // Works for dict and text! 
相關問題