2014-04-09 73 views
0

我希望能夠有一個字典<字符串,字典<字符串,字典<字符串,... >>>。我不希望字典<字符串,對象>,因爲我必須將對象強制轉換回有框內的任何對象,這使得遍歷嵌套字典變得困難。如何定義C#和VB.Net中的遞歸或嵌套數據結構?

我想能夠做到從一些串行化的數據源,如JSON,YAML,XML加載字典,然後能夠與

dict["toplevel"]["nextlevel"]["and then some"] 

背景故事

我遍歷已經將VBJSON移植到.Net。我已經(有)字典<對象,對象>我已經嵌入到其他字典<對象,對象>和列表<對象>。它讓我很煩惱,我無法輕易地在沒有大量演員的情況下穿越最終的結構。

> thing["collection"] 
Count = 4 
    [0]: {[0, dog]} 
    [1]: {[1, cat]} 
    [2]: {[2, 2]} 
    [3]: {[3, 3]} 
> thing["collection"][0] 
Cannot apply indexing with [] to an expression of type 'object' 
> (thing["collection"])[0] 
Cannot apply indexing with [] to an expression of type 'object' 
> ((Dictionary<object,object>)thing["collection"])[0] 
"dog" 
+0

你的問題是什麼?你有什麼嘗試不起作用? – Jonesopolis

+0

你可以定義一個基本列表/字典,然後另一個持有('字典(字符串,字典(T))'),然後再嵌套它,如果需要。但它是更清潔,使他們的班級leas口氣和內部化的一些複雜性 – Plutonix

+0

重複http://stackoverflow.com/questions/647533/recursive-generic-types ...或至少這擴大了@ jmoreno的回答低於 – bugmagnet

回答

3

你必須明確地定義類型(又名創建自己的類):

Public Class RecursiveDict 
     Inherits Dictionary(of String, RecursiveDict) 
End Class 

或者在C#

class RecursiveDict : Dictionary<string, RecursiveDict> { } 

一旦類型已經宣佈它都可以使用。

+0

啊,現在這看起來很有前途!請注意,http://msdn.microsoft.com/en-us/library/ms379574.aspx w.r.t.圖表,但這可能是矯枉過正 – bugmagnet

1

Tree結構似乎是你正在尋找的那種嵌套的最佳替代品。

您可以輕鬆地將Tree結構序列化到/從文件中反序列化。

public struct TreeNode 
{ 
    public KeyValuePair<string, object> Data; 
    public TreeNode Parent; 
}