2014-07-23 138 views
0

我有一個詞典作爲另一個詞典的價值部分結構的字段之一,以便課程可以包含多個類,每個類都有自己的老師和學生如下:.net詞典裏面詞典:添加新項目到內部詞典

Structure course 
    Dim description As String 
    Structure classs 
     Dim teacherCode As String 
     Dim studentIDs() As Integer 
    End Structure 
    Dim classes As Dictionary(Of String, classs) 'key=classCode 
End Structure 

Structure courseKey 
    Dim name As String 
    Dim yearLevel As Short 
End Structure 

Dim courses As New Dictionary(Of courseKey, course) 

我可以構建一個courseKey和使用空班組長子字典,courses.Add(courseKey,當然)創建一個空的課程字典項,但我不知道如何(或者的確,如果可能的話)創建具有非空類的子字典的新課程詞典條目。我希望能夠做到這樣的事情來創建一個類,然後將它添加到課程中,但是得到一個NullReferenceException (即使課程(courseKey)引用適當的字典項目,並且當classCode是有效的字符串並且類是在它的數據班組長結構的有效實例)

courses(courseKey).classes.Add(classCode, classs) 

我失去了一些東西明顯?我打算有這樣的一些數據結構,有些在另一個字典中有多個字典。如果這是不可能的,也許有更好的辦法?

+1

什麼表達式爲空?找出。我試圖把它作爲規範的NRE問題的一個重複來解決。我沒有看到這種情況是如何特殊的。 – usr

回答

3

NullReferenceException always means the same thing。在這種情況下,您沒有在您的course結構中實例化classes字典。

Dim classes As Dictionary(Of String, classs) 'key=classCode 

爲了進行比較,你實例化的courses字典與New關鍵字。

Dim courses As New Dictionary(Of courseKey, course) 

通常你會創建classes字典以同樣的方式,但在這種情況下,很structure,你也不會允許有一個結構的默認構造函數或成員初始化。

您需要在某處初始化字典,因此您有幾個選項。也許最簡單的將它包裝成一個屬性:

Private _classes As Dictionary(Of String, [class]) 

Public ReadOnly Property Classes As Dictionary(Of String, [class]) 
    Get 
     If _classes Is Nothing Then _classes = New Dictionary(Of String, [class])() 
     Return _classes 
    End Get 
End Property 

如果您的代碼可能多線程的,你會想以不同的方式處理這個問題,但在course結構將初始化其私人提供Classes屬性支持成員,如果它不存在。

(順便說一句,我改了名字classsclass和包裹在方括號逃跑的名字。)

+0

太棒了,非常感謝。這正是我需要知道的。 – user3868872

1

你的類字典裏面的課程班需要進行初始化。您可以在構造函數中執行此操作:

Structure course 

    ... 

    Public Sub New(description As String) 

     Me.description = description 
     classes = New Dictionary(Of String, classs) 

    End Sub 

    ... 

End Structure