2009-09-21 8 views
1

Hey les gars, j'essaie d'ajouter à un dictionnaire, et en recevant le "Référence d'objet non défini à une instance de un objet." Erreur. Ce que je pense signifie que ce que j'essaye de le définir n'existe pas?Impossible d'ajouter à une définition de dictionnaire csharp, recevant "Référence d'objet non définie à une instance ..."

Voici le code correspondant:

   Dictionary<string, Dictionary<int, Dictionary<string, string>>> user = new Dictionary<string, Dictionary<int, Dictionary<string, string>>>(); 
      user.Add("approved", null); 
      user.Add("pending", null); 
      user.Add("declined", null); 
      int zz = 0; 

      while (results.Read()) 
      { 
       Dictionary<string, string> field = new Dictionary<string, string>(); 
       for (int i = 0; i < results.FieldCount; i++) 
       { 
        switch (fds[i].ToString()) 
        { 
         case "gender": 
          string gend = ((Convert.ToBoolean(results[i])) == false) ? "Male" : "Female"; 
          field.Add("gender", gend); 
          break; 
         default: 
          field.Add(fds[i], results[i].ToString()); 
          break; 
        } 
       } 
       string status = results[0].ToString(); 
       user["approved"].Add(zz, field); 
       zz++; 
      } 

est-il un problème avec la façon dont je suis en train les trois dictionnaires au début? Merci,

Psy

+0

Sur quelle ligne l'ajout échoue-t-il? Vous avez plusieurs additions – blowdart

Répondre

5

Vous avez un troisième niveau dans votre structure dictionnaire imbriqué, et vous sauter l'initialisation du deuxième niveau. À tout le moins, vous devez ajouter:

user["approved"] = new Dictionary<int, Dictionary<string, string>>(); 

Que serait probablement mieux, est de faire l'initialisation plus haut avant:

user.Add("approved", new Dictionary<int, Dictionary<string, string>>()); 
user.Add("pending", new Dictionary<int, Dictionary<string, string>>()); 
user.Add("declined", new Dictionary<int, Dictionary<string, string>>()); 

Personnellement, je ne voudrais pas utiliser un dictionnaire pour user à tout. Cela implique qu'il y a un nombre variable de statuts d'une demande (ou autre), alors qu'en fait il y a un nombre fini de possibilités: en attente, approuvé, refusé. À mon avis, vous feriez mieux d'écrire un cours qui contient 3 collections pour cela.

Cela aide également à ce que vous n'ayez pas trois dictionnaires imbriqués, ce qui rend le code plus lisible. Il suffisait de vous confondre, sans parler de quelqu'un qui maintient le code après vous :)

+0

Je savais qu'il y avait un pas que j'oublie! Merci! La raison pour laquelle j'utilise des dictionnaires est que j'ai besoin de faire une boucle sur les résultats à nouveau, c'est juste une manière que j'utilise pour m'assurer qu'ils sont correctement triés par leur statut. – Psytronic

+0

... ou de définir une énumération qui englobe approuvé/en attente/refusé ... –

1

user est un dictionnaire mappant string s à un dictionnaire (dont les détails ne sont pas importants pour nos besoins). La ligne

user.Add("approved", null); 

ajoute une entrée à user mapping "approved" dans le dictionnaire null. Vous ne remettras le dictionnaire qui "approved" est associé à un dictionnaire non null de sorte que lorsque vous appuyez sur la ligne

user["approved"].Add(zz, field); 

que vous essayez d'appeler la méthode Dictionary.Add sur un dictionnaire null. Vous pouvez résoudre ce problème en ajoutant la ligne

user["approved"] = new Dictionary<int, Dictionary<string, string>>(); 

de même pour les deux autres entrées dans user.

2

Vous ne créez un objet Dictionary<int, Dictionary<string, string>>, donc dans la ligne de code:

user["approved"].Add(zz, field); // user["approved"] is null 
0

Qu'en est-:

user["approved"] = field; 

La ligne:

user["approved"].Add(zz, field); 

cogne avec un NullReferenceException parce que lorsque vous accédez à user["approved"], il renvoie null car il n'est pas init nationalisé.

Questions connexes