IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Dotnet Discussion :

Parcourir et modifier Dictionnary


Sujet :

Dotnet

  1. #1
    Membre habitué Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Points : 177
    Points
    177
    Par défaut Parcourir et modifier Dictionnary
    Bonjour,

    Je parcours un Dictionnary et je veux supprimer des élements dans certains cas.
    Mais une Exception "InvalidoperationException" est levée (La collection a été modifiée ; l'opération d'énumération peut ne pas s'exécuter.)

    Le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    foreach (KeyValuePair<string, string> pair in dicAttached) {
                    // Si séparé par des $ , => c'est une variable multiple
                    string[] clefSplit = pair.Key.Split('$');
     
                    if (clefSplit.Length > 1) { 
     
                        // Retire la clef de colonne du dictionnaire
                        dicAttached.Remove(pair.Key);
     
                        // Et ajoute la variable si elle n'est pas déjà dedans
     
                        string nomVariable = clefSplit[clefSplit.Length -1]; // prends le dernier élement
     
                        if ( ! dicAttached.ContainsKey(nomVariable) ) dicAttached.Add(nomVariable, null);
     
                    }
     
                }
    Comment modifier une un dictionnaire tout en le parcourant ?
    D'avance merci,
    TSalm

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Salut,

    pour repondre simplement, tu ne peux pas, il faut faire le traitement en deux temps. D'abord, tu enregistres la clé de tous les elements correspondants, et ensuite tu pars de cette base pour modifier ton dictionary<>.

  3. #3
    AP
    AP est déconnecté
    Membre confirmé
    Avatar de AP
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    480
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2002
    Messages : 480
    Points : 538
    Points
    538
    Par défaut
    Tout à fait, il faut faire cela en 2 étapes.
    - Tu crées un liste pour stoquer les éléments à supprimer
    - Tu parcours ton dictionnaire et tu ajoutes à ta liste les éléments à supprimer
    - Tu parcours ta liste et tu supprimes de ton dico les éléments
    - tu vides ou supprimes ta liste

  4. #4
    Membre habitué Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Points : 177
    Points
    177
    Par défaut
    ok merci

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    Note : ceci est valable pour toute collection que tu parcours avec un foreach.

    Tu peux cependant procéder autrement et récupèrer un tableau avec les clés de ton dictionary et ensuite faire un foreach dans ce tableau obtenu.

    Cette solution permet de masqué l'étape en deux temps et permet de diminuer la mémoire locale si tu ne te contente pas de faire des suppressions mais également des ajouts ou modifications, car tu ne met pas ces modifications en mémoire pour traitement dans phase ultérieure.

    Attention toutefois à la façon dont tu gere le tableau des clés.

    Si tu fait
    foreach (TKey key in mydic.Keys)
    {
    }

    tu aboutiera exactement au meme probleme...

    (une des raisons et que lorsque tu demande une énumération ils utilisent yield, ce qui oblige a respecter une assertion, qui est que la liste énumérée ne doit pas varier pendant qu'on effectue l'énumération.)

    il faut récupérer la collection et la stocker dans une liste annexe.
    en contrepartie le traitement de ton dictionary sera un peu plus long mais pourra économiser de la mémoire de traitement.

    Il n'y a pas de mystère, quand on veut gagner du temps on perd de la mémoire et quand on veut gagner de la mémoire, on perd du temps. C'est l'un ou l'autre, pas les deux.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Parcourir et modifier un AST
    Par titanic3d dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 23/05/2012, 16h42
  2. Parcourir et modifier un char*
    Par Molos dans le forum Débuter
    Réponses: 6
    Dernier message: 02/03/2012, 15h15
  3. Réponses: 11
    Dernier message: 03/08/2010, 18h19
  4. Parcourir et modifier noeuds xml
    Par snopims dans le forum ASP.NET
    Réponses: 1
    Dernier message: 08/12/2008, 13h00
  5. Parcourir et modifier une collection/generique
    Par kaervas dans le forum Débuter
    Réponses: 5
    Dernier message: 24/04/2008, 15h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo