Maison > développement back-end > C++ > Pourquoi ma boucle «Foreach» lance-t-elle une «collection a été modifiée; l'opération d'énumération peut ne pas exécuter» une erreur?

Pourquoi ma boucle «Foreach» lance-t-elle une «collection a été modifiée; l'opération d'énumération peut ne pas exécuter» une erreur?

Patricia Arquette
Libérer: 2025-02-02 03:51:09
original
597 Les gens l'ont consulté

Why Does My `foreach` Loop Throw a

La collection d'erreur "a été modifiée; l'opération d'énumération peut ne pas s'exécuter" surgit lorsqu'une boucle foreach itère sur une collection modifiée lors de l'exécution de la boucle. Cela se produit souvent lors de l'ajout ou de la suppression des éléments de la collection dans la boucle elle-même, ou d'un autre thread.

L'exemple fourni montre cette erreur dans une méthode NotifySubscribers() itérant dans un dictionnaire subscribers. Le problème découle de la méthode SignalData, qui pourrait indirectement modifier le dictionnaire subscribers pendant que NotifySubscribers() est en cours d'exécution. Cela pourrait se produire si SignalData déclenche des ajouts ou des éliminations des abonnés.

La solution consiste à créer une copie de la collection Avant Entrer dans la boucle. Cela empêche la modification de la collection originale d'affecter l'itération de la boucle:

foreach (Subscriber s in subscribers.Values.ToList())
{
    // Notify subscriber s
}
Copier après la connexion

L'utilisation ToList() crée une nouvelle liste contenant un instantané du subscribers.Values. La boucle foreach fonctionne désormais sur cette copie indépendante, garantissant que les modifications du dictionnaire d'origine subscribers ne provoqueront pas l'erreur. Cela garantit une énumération sûre et fiable.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal