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

VB.NET Discussion :

Vérifier la clef suivante d'un dictionnaire dans un For Each


Sujet :

VB.NET

  1. #1
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut Vérifier la clef suivante d'un dictionnaire dans un For Each
    Bonjour à tous.

    J'ai un dictionnaire que je parcours avec un For Each. Mais à l'intérieur de celui-ci je voudrais vérifier la clef suivante et sa valeur associer.

    Genre:
    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
    20
    21
    22
    23
    24
    25
    Dim Somme As Double.
    Dim i a integer = 0
    Dim Moyenne As Double
     
    For Each Dt As Date In Dico.Keys      ' Le dico (Key =Date,Valeur = Double)
       If Dico(Dt) = 0 then
          If Dico(key suivante) = 0 then
                'Vérification que la clef suivante est égale à l’intervalle de temps de mesure
                If ("Keys suivante" - Dt ) = intervalle then
                    Somme += Dico(Dt)
                    i += 1
                Else
                    'Pas d'ajout de valeur
                End if
           Else
                Somme += Dico(Dt)
                i += 1
           End If
       Else
          Somme += Dico(Dt)
          i += 1
       End If
    next
     
    Moyenne = Somme / i
    Le but étant d’éliminer les valeurs 0 indiquant un trou dans les mesures (Value). Si entre les 2 valeurs 0 il y a un intervalle supérieur à l'intervalle des mesures on n'ajoute pas les 0 pour le calcul de la moyenne.
    A la base, le fichier qui me sert à remplir le dico nous sert a crée des courbes. et donc les relevé de données s’arrêtent lorsqu'il n'y a rien à mesurer. Pour éviter que la courbe ne soit erronés on ajout deux 0 dans le fichier un à l’arrêt des mesures et l'autre à la reprise pour que la courbe soit bien à 0.

  2. #2
    Membre émérite Avatar de bizet
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2005
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 717
    Par défaut
    Bonjour,

    Quel est ton problème?

  3. #3
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut
    Citation Envoyé par bizet Voir le message
    Bonjour,

    Quel est ton problème?
    Bonjour, je voudrais savoir comment lire la clef suivante du dico et sa valeur, sans pour autant modifier l'ordre de lecture du For Each.

    Ou utiliser autre chose que le For Each qui me permettrait de le faire.

  4. #4
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2008
    Messages : 42
    Par défaut
    Bonjour,

    Aucune idée de comment faire ceci avec un For Each.
    Par contre tu peux le faire avec un For basique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    For i as integer= 0 to TaListe.count-1
     
    If TaListe(i+1)=0  'Test si la valeur suivante est égale a 0
     
    End If
     
    Next

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Bonjour

    L'utilisation du dictionary n'est peut être pas le meilleur choix ici. En effet, tu n'as pas moyen d'aller voir la valeur de la clef suivante sans itérer la boucle.

    Pour ce que tu veux faire, va plutôt voir du coté de la LinkedList.

    http://msdn.microsoft.com/en-us/library/he2s3bh7.aspx

    Une autre solution peut être d'utiliser un Dictionary mais sous la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dictionary<int, KeyValuePair<DateTime, Double>>
    Donc avec un rang "entier" auquel tu associe tes paires (date, valeur).

  6. #6
    Membre émérite Avatar de bizet
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2005
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 717
    Par défaut
    salut

    si tu connais ta clé suivante alors il suffit de faire
    Si tu ne la connais pas, alors effectivement il te faudra passer par une boucle for ou while.

    Bon courage.

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par bizet Voir le message
    salut

    si tu connais ta clé suivante alors il suffit de faire
    Justement, il ne la connait pas, il veut la trouver.

    Si tu ne l'as connais pas, alors effectivement il te faudra paser par une boucle for ou while.
    Ca ne me semble pas la meilleure solution.

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Meiteisho Voir le message
    Bonjour,

    Aucune idée de comment faire ceci avec un For Each.
    Par contre tu peux le faire avec un For basique
    Absolument pas : son dictionnaire n'est pas indexé par un scalaire.

  9. #9
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2008
    Messages : 42
    Par défaut
    Arf désolé, autant pour moi ...

  10. #10
    Membre émérite Avatar de bizet
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2005
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 717
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Justement, il ne la connait pas, il veut la trouver.
    Dans ce cas, effectivement une LinkedList est une meilleure solution.

  11. #11
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut
    Merci beaucoup, je connaissais pas les LinkedList ni les dico avec KeyValuePair.

    Cela va me simplifier mon codage, merci

  12. #12
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut


    Penser au bouton

  13. #13
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut
    Citation Envoyé par Bluedeep Voir le message


    Penser au bouton
    Oui Oui, j'y pense vous inquiétez pas, mais je n'est pas encore testé, j'ai été pas mal dérangé à l’atelier ce matin et le début de l'aprem devrait aussi être bouleversé. Dés que j'ai résolu mon souci se sera fait, et apparemment cela devrait le faire.

  14. #14
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    A la réflexion, tu as aussi une possibilité en naviguant directement dans le dictionnaire via la méthode MoveNext de l'énumérateur du dictionnaire :tu utilises dans ce cas la méthode GetEnumerator sur le dico, et tu peux ensuite appeler MoveNext sur l'énumérateur pour passer à l'entrée suivante.

    L'interessant de la chose est que tu peux disposer d'un énumérateur sur le dico mais aussi d'un enumérateur sur la collection de clef, en appelant GetEnumerator non pas sur le dico,mais sur la propriétés Keys; ainsi tu peux naviguer sur ta collectiion de clef indépendamment de ta navigation dans le dico.

  15. #15
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 197
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    A la réflexion, tu as aussi une possibilité en naviguant directement dans le dictionnaire via la méthode MoveNext de l'énumérateur du dictionnaire :tu utilises dans ce cas la méthode GetEnumerator sur le dico, et tu peux ensuite appeler MoveNext sur l'énumérateur pour passer à l'entrée suivante.

    L'interessant de la chose est que tu peux disposer d'un énumérateur sur le dico mais aussi d'un enumérateur sur la collection de clef, en appelant GetEnumerator non pas sur le dico,mais sur la propriétés Keys; ainsi tu peux naviguer sur ta collectiion de clef indépendamment de ta navigation dans le dico.
    Moi je me poserais surtout la question de savoir si l'utilisation d'un dictionnary à une utilité

  16. #16
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    A la réflexion, tu as aussi une possibilité en naviguant directement dans le dictionnaire via la méthode MoveNext de l'énumérateur du dictionnaire :tu utilises dans ce cas la méthode GetEnumerator sur le dico, et tu peux ensuite appeler MoveNext sur l'énumérateur pour passer à l'entrée suivante.

    L'interessant de la chose est que tu peux disposer d'un énumérateur sur le dico mais aussi d'un enumérateur sur la collection de clef, en appelant GetEnumerator non pas sur le dico,mais sur la propriétés Keys; ainsi tu peux naviguer sur ta collectiion de clef indépendamment de ta navigation dans le dico.
    Je suis en train d'analyser justement sa sur l'une des demandes que j'ai effectué pour autre chose. L'un des membres m'a proposé un code contenant justement getEnumerator.

    Je vois pas trop comment utiliser la fonction classique de déplacement avec le For Each + l'enumerator mais je vais faire des essaie, en espérant pouvoir rester à mon poste de travail cette aprem.

  17. #17
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par megamario Voir le message
    Je vois pas trop comment utiliser la fonction classique de déplacement avec le For Each + l'enumerator mais je vais faire des essaie, en espérant pouvoir rester à mon poste de travail cette aprem.
    Dans ce cas tu oublies le foreach, et tu fais une boucle while par exemple.

    Tu n'utilises que les MoveNext pour naviguer.

  18. #18
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Bonjour,

    Si ça peut aider, voici une méthode d'extension pour IEnumerable(Of T) qui permet de "fenêtrer" une séquence (code inspiré de la fonction Seq.windowed de F#)

    Code VB.Net : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    ' À mettre dans un module pour profiter de la fonctionnalité "méthode d'extension"
    <System.Runtime.CompilerServices.Extension()>
    Public Function Windowed(Of T)(ByVal source As IEnumerable(Of T), ByVal windowSize As Integer) As IEnumerable(Of T())
        If source Is Nothing Then Throw New ArgumentNullException("source")
        If windowSize <= 0 Then Throw New ArgumentOutOfRangeException("windowSize", "the window size must be positive")
     
        Dim results As New List(Of T())
     
        Using e = source.GetEnumerator
            Dim arr As T() = New T(windowSize - 1) {}
            Dim offset As Integer = windowSize - 1
            Dim i As Integer = 0
     
            While e.MoveNext
                arr(i) = e.Current
                i = (i + 1) Mod windowSize
     
                If offset = 0 Then
                    Dim window As T() = Enumerable.Range(0, windowSize).Select(Function(j) arr((i + j) Mod windowSize)).ToArray
                    results.Add(window)
                Else
                    offset -= 1
                End If
            End While
        End Using
     
        Return results
    End Function
     
    ' utilisation
    For Each duo In dict.Windowed(2) 'duo est donc un tableau de 2 KeyValuePair(Of TKey, TValue)
        ' ...
    Next

    Note: Au cas où je mets le code F# si ça peut aider
    Code F# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    let windowed windowSize (source: seq<_>) =
        if windowSize <= 0 then invalidArg "windowSize" "the window size must be positive"
        seq {
            let arr = Array.zeroCreate windowSize
            let offset = ref (windowSize - 1)
            let i = ref 0
            use e = source.GetEnumerator()
            while e.MoveNext() do
                arr.[!i] <- e.Current
                i := (!i + 1) % windowSize
                if !offset = 0 then
                    yield Array.init windowSize (fun j -> arr.[(!i + j) % windowSize])
                else
                    decr offset }
    Cordialement !

  19. #19
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut
    J'ai réussi sans souci avec KeyValuePair. Les LinkedList me semble pas mal compliquer à mettre en place, enfin j'ai survolé rapidement l'aide en ligne de Microsoft. Apparemment on peut faire pas mal de chose avec sa.

    Mais vu que j'ai réussi rapidement avec le keyValuepair. Je regarderais à temps perdu, car pour le moment faut que j'avance, cette petite semaine n'est pas très productive pour moi , ni pour mon chef

    Merci en tout cas, encore une fois on trouve des personnes formidables sur ce site, vraiment sympa pour les débutants.

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

Discussions similaires

  1. [XPATH] Récupèrer la "row" précédente dans le for each
    Par tommey dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 05/06/2007, 15h59
  2. [XSLT][débutant] Problème xsl:value-of dans xsl:for-each
    Par Choubie dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 09/05/2007, 16h30
  3. [XSLT] Element parent dans un For-each
    Par Katachana dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 20/04/2007, 09h39
  4. [XSLT] Number dans un for-each
    Par stepd dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 18/08/2006, 13h40
  5. [XML-XPATH] Problème dans un for each
    Par stailer dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 26/12/2005, 12h11

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