Question

Si je veux parcourir un dictionnaire (clé, valeur) ... pourquoi ne puis-je pas ajouter une nouvelle paire clé-valeur dans la boucle?

Dictionary<string, string> persons = new Dictionary<string, string>();

persons.Add("roger", "12");
persons.Add("mary", "13");

foreach (KeyValuePair<string,string> person in persons)
{
 Console.WriteLine("Name: " + person.Key + ", Age: " + person.Value);
 persons.Add("Xico", "22");
}
Était-ce utile?

La solution

Si vous voulez faire cela, vous devriez obtenir une copie de l'objet du dictionnaire (vous pouvez le faire de plusieurs façons), puis l'énumérer, ajoutez ce que vous voulez à l'original.

Vous ne pouvez simplement pas ajouter de nouveaux éléments lors de l'énumération d'un dictionnaire.

Autres conseils

C'est à cause de la façon dont l'énumérateur est construit.

De MSDN Dictionary.Enumerator :

  

Un énumérateur reste valide tant que la collection reste inchangée. Si des modifications sont apportées à la collection, telles que l'ajout, la modification ou la suppression d'éléments, l'énumérateur est invalidé de manière irrécupérable et son comportement est indéfini.

Cependant, il est assez facile de contourner ce problème. Faites simplement une copie du dictionnaire (ou de ses clés) et parcourez-la en ajoutant / supprimant / etc. à partir du dictionnaire d'origine, si nécessaire.

Vous ne pouvez pas modifier un dictionnaire lors de l'énumération, aussi simple que cela. Sinon, quand savez-vous que vous avez terminé?

Lors de l'énumération d'une collection (c'est-à-dire une boucle foreach), il n'est pas possible d'ajouter ou de supprimer des éléments de la collection. Pensez à tous les problèmes que cela poserait si cela était autorisé.

C'est juste ... étrange. Vous essayez d'ajouter à nouveau la même personne pour chaque personne déjà dans le dictionnaire.

Aussi: pourquoi stocker l'âge en tant que chaîne? int (ou même DateTime) semble beaucoup plus approprié.

Parce que cela va changer les éléments du Dictionnaire que vous faites défiler ... Cela n'a aucun sens ... (et vous pouvez boucler pour toujours)

Vous essayez de modifier le nombre d’entrées de la collection tout en itérant sur la boucle. Une boucle for peut accomplir cela, mais le foreach iterater ne vous le permettra pas.

Dictionary<string, string> persons = new Dictionary<string, string>();
persons.Add("roger", "12");
persons.Add("mary", "13");
for (int i = 0; i < persons.Count; i++){ 
Console.WriteLine("Name: " + persons[i].Key + ", Age: " + persons[i].Value); 
persons.Add("Xico", "22");
}

Sachez qu'il s'agit d'une boucle infinie, car vous ajoutez toujours une personne avant d'arriver à la dernière entrée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top