2014-07-23 4 views
0

J'ai un dictionnaire comme l'un des champs de la structure de la partie valeur d'un autre dictionnaire afin qu'un cours puisse contenir plusieurs classes, chacune avec son propre professeur et étudiants comme suit:dictionnaire .net dans le dictionnaire: ajouter de nouveaux éléments au dictionnaire interne

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) 

Je peux construire un courseKey et créer un cours vide entrée dans le dictionnaire en utilisant un sous-dictionnaire classs vide avec courses.Add (courseKey, bien sûr), mais je ne peux pas travailler comment (ou, en fait, si c'est possible) pour créer une nouvelle entrée de dictionnaire de cours avec un sous-dictionnaire de classes non vides. Je m'attendais à pouvoir faire quelque chose comme ça pour créer une classe puis l'ajouter au cours, mais obtenir une NullReferenceException (même si courses (courseKey) référence l'élément de dictionnaire approprié, et quand classCode est une chaîne valide et que les classes sont une instance valide de la structure classs comportant des données):

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

Suis-je manque quelque chose évidente? Je prévoyais d'avoir quelques structures de données comme celle-ci, certaines avec plusieurs dictionnaires dans un autre dictionnaire. Si ce n'est pas possible, peut-être y a-t-il un meilleur moyen?

+1

Quelle expression était nulle? Trouver. Je suis tenté de fermer cela comme un double de la question canonique NRE. Je ne vois pas comment cette affaire est spéciale. – usr

Répondre

3

NullReferenceException always means the same thing. Dans ce cas, vous n'avez pas instancié le dictionnaire classes dans votre structure course.

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

À titre de comparaison, vous avez instancié courses dictionnaire avec le mot-clé New.

Dim courses As New Dictionary(Of courseKey, course) 

Normalement, vous devriez créer votre dictionnaire classes de la même manière, mais dans ce cas, il est dans un structure, et vous n'êtes pas autorisé à avoir un constructeur par défaut ou initializers membres dans une structure.

Vous devez initialiser votre dictionnaire quelque part, vous avez donc quelques options. Probablement le plus simple serait de l'envelopper dans une propriété:

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 

Si votre code est potentiellement multithread, vous voudriez gérer cela différemment, mais qui fournit une propriété Classes sur la structure course qui initialisera son privé membre de soutien s'il n'existe pas déjà.

(Soit dit en passant, j'ai changé le nom classs-class et enveloppa entre crochets pour échapper au nom.)

+0

Génial, merci beaucoup. C'est exactement ce que j'avais besoin de savoir. – user3868872

1

Vos cours dictionary dans la classe de cours doit être initialisé. Vous pouvez le faire dans un constructeur:

Structure course 

    ... 

    Public Sub New(description As String) 

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

    End Sub 

    ... 

End Structure 
Questions connexes