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
Patricia Arquetteoriginal
2025-02-02 03:51:09601parcourir

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:

<code class="language-csharp">foreach (Subscriber s in subscribers.Values.ToList())
{
    // Notify subscriber s
}</code>

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:
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