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

Windows Forms Discussion :

Comparaison de 2 listes


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Chef de projet décisionnel
    Inscrit en
    Janvier 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet décisionnel

    Informations forums :
    Inscription : Janvier 2007
    Messages : 19
    Points : 13
    Points
    13
    Par défaut Comparaison de 2 listes
    Bonjour,

    Je suis débutante en VB.Net, et je voudrais comparer 2 listes.
    Je dois comparer une liste d'utilisateur récupérée dans une base de données, à une liste de membre d'un groupe AD, et supprimer dans le groupe AD, ceux que je ne trouve pas dans ma liste BDD, et ajouter dans le groupe AD, ceux qui existent dans la liste BDD, mais pas dans le groupe AD.

    J'ai crée une classe Utilisateur, qui a comme propriété, entres autres : login

    Je crée une liste d'objets Utilisateur, dans laquelle je stocke les utilisateurs issus de la BDD

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim ListeUtilisateur As List(Of Utilisateur) = New List(Of Utilisateur)
    DRUser = PROXYBDDuser.PS_S_ListeColAffecteParAnnonceur(DR("ANN_DEP_ID"))
    While DRUser.Read
              Dim utl As Utilisateur = New Utilisateur
              utl.Login = LCase(DRUser("COL_LOGIN"))
              utl.Restreint = DRUser("ACC_ARB_CADRE_CONTRACTUEL")
              utl.DomaineNtUser = LCase(DOMAINENTUSER)
              utl.DN = objLdap.getDistinguishedNameUser(utl.Login)
              ListeUtilisateur.Add(utl)
    End While
    Je fais la même chose pour ma liste de membres du groupe AD.
    J'obtiens donc 2 listes : ListeUtilisateur et ListeMembre, que je veux ensuite comparer ...
    et là, je suis bloquée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     For Each utl As Utilisateur In ListeUtilisateur
                            If Not (ListeMembre.Find(AddressOf ParLogin)) Then
                                MsgBox("Ajoute personne dans le groupeAD" & utl.Login)
                            End If
                        Next
     
     
    Public Function ParLogin(ByVal utl As Utilisateur, ByVal mbr As Utilisateur) As Boolean
            If utl.Login = acc.Login Then Return True Else Return False
        End Function
     
    Delegate Function CompareLogin(ByVal utl As Utilisateur, ByVal accAs Utilisateur) As Boolean
    Visual studio me renvoie une erreur :
    La méthode 'Public Function ParLogin(utl As Traitement_Arborescence.Utilisateur, acc As Traitement_Arborescence.Utilisateur) As Boolean' n'a pas la même signature que le délégué 'Delegate Function Predicate(Of T)(obj As Utilisateur) As Boolean'.

    Merci à tous pour votre aide

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    La méthode Find prend en paramètre un Predicate<T>, pas un CompareLogin

    Il faut créer une méthode qui prend en paramètre un Utilisateur et renvoie true s'il correspond à l'élément recherché. Le plus pratique dans ce cas est d'utiliser une lambda expression (nécessite VB 2008) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Not ListeMembre.Find(Function(u) u.login = utl.login) Is Nothing Then
    ...

  3. #3
    Membre à l'essai
    Profil pro
    Chef de projet décisionnel
    Inscrit en
    Janvier 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet décisionnel

    Informations forums :
    Inscription : Janvier 2007
    Messages : 19
    Points : 13
    Points
    13
    Par défaut Et en VB.net 2005
    Merci beaucoup pour votre réponse
    Mais je suis en 2005 ...

    J'en déduis que cette méthode n'est pas possible en 2005 ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Dans ce cas il faut faire une vraie méthode (i.e. pas anonyme)
    Le problème c'est que le paramètre varie d'un appel à l'autre selon ce que tu cherches. Donc je pense que la solution est de faire une classe qui contient la méthode et la valeur recherchée :
    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
    Public Class UserFinder
        ' Le login recherché
        Public Login As String
     
        Public Sub New(Dim login As String)
            Me.Login = login
        End Sub
     
        ' Le prédicat pour la recherche
        Public Function Predicate(u As Utilisateur) As Boolean
            If u.Login = Me.login Then
                Return True
            Else
                Return False
            End If
        End Function
    End Class
    Et tu l'utilises comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim finder As New UserFinder(utl.Login)
    If Not ListeMembre.Find(AddressOf finder.Predicate) Is Nothing Then
    Pas certain que ça marche, mais dans l'idée c'est ça... En fait tu irais peut-être aussi vite en faisant une boucle sur la collection

  5. #5
    Membre à l'essai
    Profil pro
    Chef de projet décisionnel
    Inscrit en
    Janvier 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet décisionnel

    Informations forums :
    Inscription : Janvier 2007
    Messages : 19
    Points : 13
    Points
    13
    Par défaut Ca fonctionne, mais ...
    Merci pour ta réponse, le code fonctionne, mais je n'obtiens le principe que j'attendais ...

    Il compare chaque élément de ma 1ère collection à tous les éléments de la 2ème.
    En effet, une boucle sur la collection fonctionnerai aussi bien

    Un collègue m'a proposé une solution en C#, que je n'arrive pas à reproduire en VB.net, qui elle compare les 2 listes, et me renvoie uniquement la liste des ajouts par rapport à la liste 2 et la liste des suppressions par rapport à la liste 2 :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    class Droit
        {
     
            private string _login;
     
            public string Login
            {
                get { return _login; }
                set { _login = value; }
            }
     
     
            public Droit()
            {
            }
     
            public Droit(string Login)
            {
               _login = Login;
            }
     
            // Renvoie une instance statique de la classe
     
            static private Droit _instance = null;
            static public Droit Instance
            {
                get
                {
                    if (_instance == null)
                        _instance = new Droit();
                    return _instance;
                }
            }
    Appel de la classe :
    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
    Droit monDroit = new Droit();
                List<Droit> malistedbdroits = droitsdb();
                List<Droit> malistedossierdroits = droitsdossiers();
     
     
                foreach (Droit ledossierdroit in malistedossierdroits)
                {
                    // recherche dans les droits Dossier les logins ne se trouvant pas  dans la db
     
                    Droit trouve = malistedbdroits.Find(delegate
                        (Droit d) { return d.Login == ledossierdroit.Login; });
     
                    if (trouve == null)
                    {
                        MessageBox.Show(" Supprimer du Dossier  " + ledossierdroit.Login);
                        ledossierdroit.Delete(ledossierdroit);
                    }
     
                }
    je ne suis pas sûre que ce soit faisable en VB.net

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Ahcatan6 Voir le message
    je ne suis pas sûre que ce soit faisable en VB.net
    Si, bien sûr, mais je ne retrouve plus la syntaxe pour les méthodes anonymes en VB.NET... sinon je t'aurais indiqué dès le départ une solution similaire

    EDIT :
    Citation Envoyé par tomlev Voir le message
    je ne retrouve plus la syntaxe pour les méthodes anonymes en VB.NET...
    OK, je viens de comprendre pourquoi je ne la retrouvais pas... c'est parce qu'elle n'existe pas
    Les méthodes anonymes ne sont pas supportées par VB.NET (mais les lambda expressions le sont en VB9)

    Donc tu peux faire quelque chose de similaire, mais tu as toujours le problème de closure ("fermeture") sur utl.login (c'est pour ça que j'ai créé une classe spécifique pour ça)

  7. #7
    Membre à l'essai
    Profil pro
    Chef de projet décisionnel
    Inscrit en
    Janvier 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet décisionnel

    Informations forums :
    Inscription : Janvier 2007
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    C'est donc pour ça que je ne trouvais en VB !

    Je suis désolée, mais je ne comprends pas très bien la dernirèe partie de ta réponse ...
    Que veux-tu dire par closure de utl.login ?

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Ahcatan6 Voir le message
    Je suis désolée, mais je ne comprends pas très bien la dernirèe partie de ta réponse ...
    Que veux-tu dire par closure de utl.login ?
    Arf, je savais bien que j'aurais pas dû utiliser un mot comme ça
    Comme je serais bien incapable d'en donner une définition claire, je te renvoie sur Wikipedia
    http://fr.wikipedia.org/wiki/Fermeture_(informatique)

    En gros, ce que je veux dire, c'est que, comme Find prend en paramètre une méthode, et que la méthode en question n'accepte qu'un paramètre (la valeur de la liste qu'il faut tester), il faut trouver un moyen de lui passer aussi la valeur avec laquelle on compare (utl.login). Ca marche tout seul si on fait une lambda expression comme dans mon post #2, sinon il faut recourir à une autre technique. On aurait pu mettre utl.login dans une variable membre, accessible à partir du prédicat, mais ça pose des problèmes de thread-safety et de réentrance (désolé ). Donc, avec une classe qui englobe le prédicat et la valeur de comparaison, tout baigne... normalement

  9. #9
    Membre à l'essai
    Profil pro
    Chef de projet décisionnel
    Inscrit en
    Janvier 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet décisionnel

    Informations forums :
    Inscription : Janvier 2007
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Merci beaucoup
    et j'ai compris ce qu'était une "fermeture"

    Ta classe marche nickel, je n'avais pas correctement tester ce matin ...

    Un grand merci

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

Discussions similaires

  1. Comparaison entre 2 listes
    Par fezzani dans le forum Composants
    Réponses: 3
    Dernier message: 31/05/2012, 10h21
  2. Comparaison de deux listes
    Par Isabella83 dans le forum Langage
    Réponses: 12
    Dernier message: 30/03/2012, 12h11
  3. [XL-2003] Comparaison d'une liste de Numero de serie
    Par nolimit dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/09/2009, 13h43
  4. Comparaison de deux listes de fichier
    Par jackiechen dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 07/01/2008, 16h28
  5. Comparaison d'une liste de string à un string
    Par maxazac dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 19/10/2005, 15h39

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