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 :

Utiliser IndexOf dans un List (Of <Class>) ?


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 125
    Points : 66
    Points
    66
    Par défaut Utiliser IndexOf dans un List (Of <Class>) ?
    Bonjour à tous,

    Je cherche à mettre des données dans une List (of <Class>), mais avant d'insérer, je veux vérifier si la donnée existe déjà.

    Voici ce que j'ai :

    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
     
        Private Class GroupSecuDims
            Public Property GroupName As String
            Public Property SecuDim As String
        End Class
     
       Private sub Test()
          Dim _groupSecuDims = New List(Of GroupSecuDims)
          For i = 0 to DGV.rows.count -1
               ' Le DGV a 2 champs, qui correspondent à GroupName et SecuDim
               if _groupSecuDims.indexOf(GroupName = DGV(GroupName).value & SecuDim = DGV(SecuDim).value) then
                    '_groupSecuDims.Add(New GroupSecuDims With {.GroupName = groupName, .SecuDim = secuDim})                            
               end if
          Next
     
       End Sub
    Ma question concerne le test que je dois faire pour tester s'il y a déjà un enregistrement avec les mêmes données.

    Je sais que je pourrais faire une boucle pour aller vérifier chaque ligne. Mais je pense que le IndexOf doit être plus rapide.

    Merci d'avance.

  2. #2
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    Sûr que IndexOf est le moyen le plus rapide de savoir si une donnée est déjà présente dans une liste.
    La méthode retourne l'index de la donnée dans liste, de 0 à Count-1, et -1 si la donnée ne s'y trouve pas.

    Mais je n'ai sans doute rien compris à ta question parce que ta syntaxe ne me paraît pas correcte :

    _groupSecuDims.indexOf(GroupName = DGV(GroupName).value & SecuDim = DGV(SecuDim).value).

    Si GroupeName est le nom d'une colonne du DGV, alors la syntaxe serait sans doute :

    If _groupSecuDims.indexOf( DGV(GroupName).value) > -1 Then ... ' la donnée existe.

    et si SecuDim est aussi un nom d'une colonne du DGV, ET qu'il faut que les 2 colonnes soient trouvées pour considérer que le donnée existe, alors la syntaxe serait sans doute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If _groupSecuDims.indexOf( DGV(GroupName).value) > -1  ANDALSO  _groupSecuDims.indexOf( DGV.(SecuDim).value) > -1 Then ... ' la donnée existe
    Mais j'ai un doute sur un détail. Je ne crois pas que DGV(GroupName).value donne une valeur (toujours sous réserve de ma bonne compréhension de ta question), je crois que la syntaxe serait plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim IndexColonne As Integer = DGV.Columns("GroupName").Index
    Dim IndexLigne As Integer   ' valeur à fournir
    ' et puis on accède à la valeur par :
    DGV.Item(IndexColonne, IndexLigne).Value
    Bonne journée

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 125
    Points : 66
    Points
    66
    Par défaut
    Bonjour Phil,

    Merci pour ta réponse. Mais j'ai dû mal présenter le problème, car ta réponse ne convient pas..

    En gros, j'ai un tableau avec 2 colonnes, et plusieurs valeurs :
    GroupName SecuDim
    AA Secu 1
    AA Secu 2
    BB Secu1

    Et dans mon DGV, j'ai aussi ces 2 colonnes, avec d'autres colonnes.
    Et pour chaque ligne de mon DGV, je veux vérifier que pour les valeurs GroupName et SecuDim de la ligne, ces valeurs existent bien dans mon tableau.
    En sachant que mon tableau est représenté par une Class.
    Donc, dans mon test IndexOf, il que que je vérifie l'existence d'un enregistrement avec le GroupName ET le SecuDim.
    Par exemple, si dans mon DGV, j'ai (GroupName = 'AA' ET SecuDim = 'Secu 3'), je veux être alerté (car ce cas n'est pas présent dans le tableau)

    Note : S'il y a plus simple pour réprésenter mon tableau que la Class, çe ne pose aucun problème de changer.

    Merci d'avance

  4. #4
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Comment se nomme ton tableau et par quel code accèdes-tu aux élément du tableau ?

    En fait, je souhaite avoir la syntaxe qui permet quelque chose comme ça : MonTableau.GroupeName.IndexOf(...) .


    ...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 125
    Points : 66
    Points
    66
    Par défaut
    Comme indiqué dans mon premier message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     Private Class GroupSecuDims
            Public Property GroupName As String
            Public Property SecuDim As String
        End Class
     
       Private sub Test()
          Dim _groupSecuDims = New List(Of GroupSecuDims)
    Ce n'est pas vraiment un tableau, mais une List (of GroupSecuDims)..

    Cette List (of...) est ensuite remplie "à la main" ailleurs dans le programme. On va donc considérer que les données sont déjà dedans.

    (merci pour l'aide)

  6. #6
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Re ...

    L’utilisation de IndexOf ne donne aucun résultat valide, sans doute parce que la méthode n'est pas surchargée dans ta Class.
    Comme tu peux le voir sur la 1ère illustration, lors d'une exécution en pas à pas, la méthode ne trouve pas la pair "AA", "Secu 1" pourtant bien présente dans la ListOf.
    Le code de cette exécution se trouve dans le projet de test que je t'envoie : DataTable_ListOf.zip
    Nom : ListOf01.jpg
Affichages : 385
Taille : 122,9 Ko

    A défaut de pouvoir utiliser IndexOf, j'ai écrit ma propre boucle de recherche. Elle exécute le travail que tu demandes.
    Pour signaler l'absence de l'info dans la ListOf, je mets en rouge le texte concerné dans le DataGridView.
    Nom : ListOf02.jpg
Affichages : 373
Taille : 30,5 Ko

    J'espère que ça te dépannera ...

  7. #7
    Membre régulier
    Homme Profil pro
    Trader / Formateur / Développeur Options CBOE
    Inscrit en
    Septembre 2018
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Trader / Formateur / Développeur Options CBOE
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2018
    Messages : 86
    Points : 70
    Points
    70
    Par défaut
    Pourquoi ne pas utiliser un Hashset à la place d'une List ?
    Un Hashset peut être constitué de GroupSecuDims et il n'acceptera jamais de doublon.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 125
    Points : 66
    Points
    66
    Par défaut
    Merci pour vos remarques.
    Je ne connaissais pas le Hashset. Je vais voir comment on l'utilise.

  9. #9
    Membre régulier
    Homme Profil pro
    Trader / Formateur / Développeur Options CBOE
    Inscrit en
    Septembre 2018
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Trader / Formateur / Développeur Options CBOE
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2018
    Messages : 86
    Points : 70
    Points
    70
    Par défaut
    Attention toutefois qu'un Hashset n'a pas de notion d'ordre de ses éléments ou d'index.
    Il faut alors le convertir en List ou Array où là on a accès à ces fonctions (Sort, Reverse etc.)

Discussions similaires

  1. Ma class n'apparait pas dans la liste des objets de mon programme.
    Par parp1 dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 25/04/2007, 15h20
  2. Réponses: 5
    Dernier message: 01/03/2007, 18h08
  3. Réponses: 5
    Dernier message: 18/01/2007, 20h09
  4. [css]problème d'attribution de classe dans deux listes
    Par Mitaka dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 24/11/2005, 18h05
  5. utiliser mysql++ dans une classe
    Par Yevetrovitch dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 11/04/2005, 10h53

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