2013-06-25 3 views
0

J'itérer à travers une collection de KeyValuePair, puis de copier la clé et la valeur à une classe nouvellement créée comme suit:Comment itérer une collection de KeyValuePair

 Classes.MemberHierarchy membHier = new Classes.MemberHierarchy(); 
     List<Classes.MemberHierarchy> membHierList = new List<Classes.MemberHierarchy>(); 

     foreach (KeyValuePair<string, string[]> acct in acctData) 
     { 
      membHier.entityName = acct.Key; 
      membHier.Accounts = acct.Value; 
      membHierList.Add(membHier);     
     } 

Le problème est que, lors de la 2e itération, Les propriétés membHierList sont immédiatement remplacées par les valeurs de la première itération. C'est très étrange. Ainsi, dès la première itération, membHier.entityName est "ABC Member" et les comptes sont remplis avec le tableau de chaînes sans problème.

Ensuite, lors de la 2ème itération, membHier.entityName est "Membre XYZ".

maintenant "Membre XYZ" occupe deux emplacements comme suit

membHierList [0] .base.entityName = "XYZ Membre" membHierList [1] .base.entityName = "Membre XYZ"

Do J'ai un conflit d'objet en haut?

Merci à l'avance .... Bob

Répondre

3

Non, ce n'est pas étrange parce que vous déclarez et initialiser l'objet membHier juste une fois avant que la boucle et puis essayer d'insérer dans le nouvelle liste le même objet.

Cela permettra de résoudre votre problème

List<Classes.MemberHierarchy> membHierList = new List<Classes.MemberHierarchy>(); 

    foreach (KeyValuePair<string, string[]> acct in acctData) 
    { 
     Classes.MemberHierarchy membHier = new Classes.MemberHierarchy(); 
     membHier.entityName = acct.Key; 
     membHier.Accounts = acct.Value; 
     membHierList.Add(membHier);     
    } 

Déclarant une instance de l'objet NOUVEAU MemberHierarchy à chaque boucle va remplir la liste des différentes instances et chaque cas a ses propres valeurs.
Au lieu de cela, avec l'initialisation en dehors de la boucle, à chaque itération, vous mettez à jour la même instance avec les valeurs extraites. Mais membHier est un type de référence, donc s'il n'est pas réinitialisé, il pointe vers la même mémoire où sont stockées les valeurs de la première entité et vous écrasez ces valeurs avec la deuxième entité. A la fin, tous les éléments de la liste pointent vers le même emplacement mémoire et ces emplacements mémoire contiennent les données de la dernière entité

2

Vous devez déplacer la construction de membHier à l'intérieur de la boucle foreach. La façon dont votre code est écrit maintenant, une seule instance de la classe MemberHierarchy est créée.

List<Classes.MemberHierarchy> membHierList = new List<Classes.MemberHierarchy>(); 

foreach (KeyValuePair<string, string[]> acct in acctData) 
{ 
    Classes.MemberHierarchy membHier = new Classes.MemberHierarchy(); 
    membHier.entityName = acct.Key; 
    membHier.Accounts = acct.Value; 
    membHierList.Add(membHier);     
} 

en utilisant la syntaxe actuelle C# 4.0, il ressemblerait à ceci:

var membHierList = new List<Classes.MemberHierarchy>(); 

foreach (var acct in acctData) 
{ 
    membHierList.Add(new Classes.MemberHierarchy 
    { 
     entityName = acct.Key; 
     Accounts = acct.Value; 
    }); 
} 
+0

grâce à vous deux. Parfait! –

Questions connexes