9
votes

C # - Changer la valeur du dictionnaire paire de la valeur de la clé de la dictionnaire pendant que

J'ai ce code qui est exécuté chaque image d'un jeu: xxx

Cela me donne l'erreur suivante:

la collection a été modifiée; L'opération d'énumération peut ne pas exécuter.

existe un moyen de modifier la valeur dans la paire de la valeur de la clé à l'intérieur de la boucle de Forache, sans copier le dictionnaire chaque image?


0 commentaires

6 Réponses :


0
votes

Désolé, vous ne pouvez pas.

Je suppose que votre meilleur pari est de créer un nouveau dictionnaire puis l'échange avec l'ancien lorsque vous avez terminé avec le foreach boucle.


0 commentaires

0
votes

Vous devez utiliser un autre modèle pour faire ce que vous essayez de faire parce que le pour chacun ne vous permet pas de changer l'énumérateur que vous bouclez. Imaginez si vous exécutez une liste de régime sur une liste triée depuis le début, vous commencez à traiter l'élément avec clé = "A" alors vous allez sur "B" alors vous modifiez "C" "B", qu'est-ce qui va se passer? Votre liste est remplacée et vous ne connaissez plus ce que vous êtes en boucle et où vous êtes.

en général, vous "pourrait" le faire avec A pour (int i = dictionary.Count-1; i> = 0; --i) ou quelque chose comme ça, mais cela dépend aussi de votre contexte, j'essaierais vraiment de Utilisez une autre approche.


0 commentaires

0
votes

Vous ne pouvez pas modifier une collection tout en l'énumérant à l'intérieur d'une déclaration . Donc, vous deviez devoir le copier à chaque fois (il vous suffit de copier les clés). Une autre option stockerait une liste de clés distincte à tout moment (par exemple, en encapsulant le dictionnaire dans une classe qui le gère). Quelque chose comme: xxx

bien sûr, dans un environnement simultané, vous devez vous assurer que le dictionnaire et la liste sont synchronisés ...


0 commentaires

0
votes

Une approche commune consiste à mémoriser les clés que vous souhaitez modifier dans la première boucle, puis à avoir une seconde qui boucle sur les touches mémorisées et change le dictionnaire d'origine. Qui évite de créer un dictionnaire complètement nouveau avec tous les éléments.


0 commentaires

3
votes

Non, vous ne pouvez pas. Il y a une option Nasty que vous pouvez utiliser: xxx

alors vous créeriez (disons) un dictionnaire dictionnaire > ... itérate sur les paires de touches / valeur et modifiez la valeur dans l'emballage plutôt que de rendre l'entrée elle-même se référer à une enveloppe différente.

Je ne fais pas pense que je recommanderais cependant - il serait gênant d'utiliser et facile à maluus .

Une autre option si vous utilisez .NET 4 est à utiliser concurrentdictionner , qui fait permettre des modifications simultanées.


0 commentaires

13
votes

Je conseille de tenter de modifier une collection tout en boucle avec des dictionnaires, mais cela est possible car l'accès à clé directe est disponible. Il suffit d'ajouter .toarray () après le conditionné.Keys dans le foreach , les touches deviennent une collection séparée et vous pouvez modifier le dictionnaire: < Pré> xxx

Vous devez également modifier votre code de sorte que si la touche change vous supprimez une entrée de votre dictionnaire et ajoute le nouveau, car les clés ne peuvent vraiment pas être modifiées, simplement enlevées. < BR> Encore une fois, cela n'est pas recommandé.


1 commentaires

C'est génial! Merci tu as fait ma journée