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 :

VB.NET Doublons dans Liste


Sujet :

VB.NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 169
    Points : 100
    Points
    100
    Par défaut VB.NET Doublons dans Liste
    Bonjour,

    Je rencontre un mystère avec la fonction IndexOf. Je dois batir une liste d'éléments uniques basée sur plusieurs sources: une table Access MDB et des fichiers textes. J'ajoute tous les éléments venant de la table MDB puis les éléments venant du fichier texte si celui ci n'est pas déjà présent dans la liste.

    La table MDB est bâtie comme suit:
    Nom
    Prenom
    NumeroSecu

    les fichiers texte:
    Nom<tab>Prenom<tab>NumeroSecu

    J'ai créé une classe cItem avec
    Nom (string)
    Prenom (string)
    NumeroSecu (string)

    et un tableau Clients as new list(Of cItem)

    Je récupère mes enreg de la table via un DataRow():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For Each R As DataRow In Planning
      dim sNom as string=R(0) : dim sPrenom as string=R(1) : dim sNumeroSecuas string=R(3)
      LigneMDB = New cItemWith {.Nom = sNom , .Prenom = sPrenom , .NumeroSecu = sNumeroSecu}
      Clients.Add(LigneMDB )
    next
    Ensuite, je récupère mes enreg du fichier texte via un sTexte=File.ReadAllLines(FichierText) et je teste qu'il n'existe pas déjà dans la liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    For Each sLigne As String In sTexte
      dim sChamps() as string = Split(sLigne, vbTab)
      dim sNom as string=sChamps(0) : dim sPrenom as string=sChamps(1) : dim sNumeroSecuas string=sChamps(3)
      LigneTXT = New cItemWith {.Nom = sNom , .Prenom = sPrenom , .NumeroSecu = sNumeroSecu}
      if Clients.IndexOf(LigneTXT )>0 then
        msgbox("déjà là!")
      else
        Clients.Add(LigneTXT )
      end if
    next
    Et bien qu'il existe des doublons entre le MDB et le Txt, le IndexOf ne détecte rien. J'ai bien comparé pour ce doublon chacune des propriétés de classe pour l'enreg issu du MDB et l'enreg issu du Txt. Elles sont toutes égales!
    Par contre LigneMDB.equals(LigneTXT) me retourne False

    Avez vous une explication ?

    Merci pour mes cheveux

    Olivier


    <LASTNEWS:> Je me suis "amusé" avec LINQ et l'instruction Distinct qui devrait résoudre le problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Dim result = From L In Clients
                         Order By L.Nom, L.Prenom
                         Select L
                         Distinct
    Et bien même résultat: il ne voit pas les doublons!

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    oui, ca tient à la spécifité du langage
    vb.net est un langage orienté objet

    client est une classe donc quand tu fais un new client, un nouvel espace mémoire est créé, et un pointeur est attributé à la variable
    et même si tu as 2 instances de client avec les même infos, ce sont bien 2 instances, donc pas d'égalité (l'égalité entre 2 instances de classe se teste d'ailleurs avec Is), donc indexof ne trouve pas
    car ca teste si le pointeur est le même, et tu as un pointeur vers le new client créé par mdb et un autre vers le new client créé par le fichier
    un peu comme si tu avais 2 tiroirs identiques (instances) et que tu mets la même feuille A4 dans chaque, ils restent différents

    pour remédier à celà tu peux tenter de modifier la classe client en structure, les structures contiennent les données directement alors que les classes un pointeur, donc au lieu de tester les pointeurs ca testera le contenu
    sinon il faudrait tester toutes les propriétés pour vérifier l'égalité
    ou encore surcharger l'opérateur = sur ta classe et écire le code qui teste l'égalité de 2 instances, et au lieu du indexof écrire une boucle qui teste si = (au lieu de Is)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 169
    Points : 100
    Points
    100
    Par défaut
    Alors là j'ai un peu de mal à déjouer ce genre de "piège" de philo

    Du coup comme suggéré j'ai changé ma classe pour une structure. C'est OK.

    Merci

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

Discussions similaires

  1. [XL-2007] doublon dans liste
    Par chris09300 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/03/2012, 09h41
  2. recherche doublon dans liste
    Par pingouinos_64 dans le forum Général Python
    Réponses: 10
    Dernier message: 10/11/2011, 09h08
  3. Access 2007 doublon dans liste deroulante
    Par jean- dans le forum IHM
    Réponses: 13
    Dernier message: 28/01/2008, 16h31
  4. doublons dans liste déroulante
    Par nicolovitch dans le forum Access
    Réponses: 2
    Dernier message: 27/07/2006, 12h17
  5. [Oracle] Doublon dans une liste
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 9
    Dernier message: 09/06/2006, 16h09

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