Maison >développement back-end >C++ >Comment résoudre l'erreur 'Collection a été modifiée' lors de l'itération d'un dictionnaire en C #?

Comment résoudre l'erreur 'Collection a été modifiée' lors de l'itération d'un dictionnaire en C #?

Susan Sarandon
Susan Sarandonoriginal
2025-02-02 03:41:09942parcourir

How to Resolve the

Résoudre facilement le problème de "la collection a été modifiée": Évitez les modifications de la liste dans le cycle

Dans le processus de programmation, lorsque la "collection a été modifiée; l'énumération peut ne pas être exécutée", les programmeurs sont souvent confus, en particulier lorsque le problème est encore difficile à détecter sous le débogueur. Cependant, ne vous inquiétez pas, la solution consiste à comprendre les changements de liste potentiels dans le cycle d'erreur.

Cette erreur se produit lorsque l'élément de la collection est modifié lorsque la circulaire définit. Dans le fragment de code du serveur WCF, le dictionnaire "Subsident" est modifié dans le cycle "ForEach" de la méthode "NotifySubscrirs". Plus précisément, lorsque la méthode "SignalData" est indirectement modifiée, cette erreur sera causée.

Afin de résoudre ce problème, nous pouvons utiliser la méthode "Tolist ()" pour convertir la valeur du dictionnaire en une nouvelle liste avant le cycle, évitant ainsi le piège du "modifié". Cela créera une liste distincte indépendante du dictionnaire d'origine pour s'assurer que les modifications à lui pendant le cycle n'affecteront pas le processus itératif.

Ce qui suit est la méthode pour ajuster le code:

En utilisant cette technologie, le cycle ne fonctionne plus le dictionnaire d'origine, mais exploite une copie indépendante. Cela élimine la possibilité d'une modification simultanée et empêche l'erreur ennuyeuse de "la collecte a été modifiée".
<code class="language-c#">private static readonly IDictionary<Guid, Subscriber> subscribers = new Dictionary<Guid, Subscriber>();

...

public void NotifySubscribers(DataRecord sr)
{
    foreach (Subscriber s in subscribers.Values.ToList()) // 将值复制到单独的列表中
    {
        try
        {
            s.Callback.SignalData(sr);
        }
        catch 
        ...
    }
}</code>

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