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

C# Discussion :

modification de la value d'une entrée de dictionnaire


Sujet :

C#

  1. #1
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Points : 661
    Points
    661
    Par défaut modification de la value d'une entrée de dictionnaire
    Hello,
    C'est surement tres con, mais voici mon problème :

    pour un dictionnaire de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected IDictionary<Maclasse, uint> m_Dico;
    je tente de modifier la VALUE (et non la clé), mais le compilo me dis que VALUE est read only... !?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foreach (var Entry in m_Dico)
    {
        if (Entry.Value > uiRefValue)
        {        
            Entry.Value--;//Erreur Ici
        }
    }
    Comment feriez vous pour faire cette ecriture ?

    Error 1 Property or indexer System.Collections.Generic.KeyValuePair<Maclasse,uint>.Value' cannot be assigned to -- it is read only
    Pour les details, cherche tout seul !

  2. #2
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Citation Envoyé par ZaaN Voir le message
    Comment feriez vous pour faire cette ecriture ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach (var Entry in m_Dico)
    {
        if (Entry.Value > uiRefValue)
        {        
            //Entry.Value--;//Erreur Ici
            m_Dico[Entry.Key]--;
        }
    }
    Voila une des raisons pour lesquelles je n'aime pas le mot-clé var... Si tu avais su immédiatement de quel type était Entry tu trouveras facilement où est ton erreur...

    Le problème de cette boucle c'est que tu modifie la collection et le foreach ne pourra plus continuer :-(

  3. #3
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foreach (var Entry in m_Dico)
    {
        if (Entry.Value > uiRefValue)
        {        
            m_Dico[Entry.Key] = Entry.Value - 1;
        }
    }
    C'est parce que la valeur de ton dico est de type Valeur (une struct, quoi )

    [edit] La solution de neptune est mieux, en effet.
    ಠ_ಠ

  4. #4
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Citation Envoyé par Guulh Voir le message
    C'est parce que la valeur de ton dico est de type Valeur (une struct, quoi )
    Non, pas vraiment. C'est surtout que KeyValuePair<T> ne définit qu'un Get pour Value et non un Set. ;-)

  5. #5
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Points : 661
    Points
    661
    Par défaut
    merci bcp !

    Autre question sur le meme exemple : Aurais-je une moyen de filtrer mes valeur dans l'entete de la boucle, plustot que dans un if à l'interieure de la boucle ?

    un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach (var Entry in m_Dico.FILTERonVALUEbigger(uiRefValue))
    {
        m_Dico[Entry.Key]--;   
    }
    Pour les details, cherche tout seul !

  6. #6
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Non ce n'est pas possible, il faut imbriquer une boucle supplémentaire.

    A moins qu'en 3.x... Mais pas en 2.0.

  7. #7
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par neptune Voir le message
    Non, pas vraiment. C'est surtout que KeyValuePair<T> ne définit qu'un Get pour Value et non un Set. ;-)
    Ce que je veux dire, c'est que si sa Value était de type classe, il aurait pu faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dictionary<int, Classe> dico;
    foreach(KeyValuePair<int, Classe> entry in dico)
    {
    if (truc)
      entry.Value.UneProp += 1;
    }
    Alors que là, comme c'est une struct, on ne peut ni le réaffecter (comme les classes) ni le modifier (contrairement aux classes).

    Bon, bref

    Pour Zaan : un dico est aussi un ICollection de KeyValuePair, tu pourrais imaginer de faire un équivalent du FindAll de la List<T> qui prendrait ça en entrée et ressortirait une liste filtrée en sortie, mais ça vaut pas la peine.

    Ou avec des yield return... mais c'est inutilement compliqué ()
    ಠ_ಠ

  8. #8
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Points : 661
    Points
    661
    Par défaut
    Citation Envoyé par neptune Voir le message
    Le problème de cette boucle c'est que tu modifie la collection et le foreach ne pourra plus continuer :-(
    Dans ce cas quelle est la meilleure solution pour faire un traitement tel que je le desire ? ( modifier plusieurs element du dico)

    Faire un nouveau dico en recopiant les clé et en modifiant les valeurs ?
    autre solution ?
    Pour les details, cherche tout seul !

  9. #9
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Au lieu d'énumérer ta liste, parcourt la (for plutot que foreach).

  10. #10
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Points : 661
    Points
    661
    Par défaut
    je trouve pas le moyen d'acceder à un element bien precis avec un for.

    J'ai pensé qu'avec un compteur basé sur .Count puis un acces aux elements que j'ai pas trouvé ... ! (ElementAt ... pas trouvé)

    Bref j ai trouvé une autre methode plus simple et rapide à coder!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var DicoTemp = new Dictionary<Maclasse, uint>(m_Dico);
    foreach (var Entry in DicoTemp)
    {                
          if (Entry.Value > uiRefValue)
          {                    
               m_Dico[Entry.Key]--;                     
          }                                            
    }
    Pour les details, cherche tout seul !

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

Discussions similaires

  1. [1.x] [Admin Generator] Modification d'une entrée et clés étrangères
    Par dourouc05 dans le forum Symfony
    Réponses: 12
    Dernier message: 08/10/2010, 12h26
  2. Réponses: 2
    Dernier message: 05/07/2007, 21h11
  3. Bug a la modification d'une entrée dans table
    Par porci82 dans le forum VBA Access
    Réponses: 1
    Dernier message: 20/06/2007, 14h28
  4. VBA : modification d'une entrée dans une table
    Par Thibaut_Dupont dans le forum Access
    Réponses: 6
    Dernier message: 13/07/2006, 15h24
  5. [SQL] pb de modification d'une entrée de ma bd
    Par auryn111 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/09/2005, 10h54

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