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] Comment Vérifier l'existence d'un objet dans une collection


Sujet :

VB.NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut [vb.net] Comment Vérifier l'existence d'un objet dans une collection
    Bonjour,

    Actuellement dans mon programme je travaille avec une collections d'objets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'stock les resultats par secteur
        Public collgSecteurResult As New System.Collections.Generic.List(Of secteurResult)
    définition de la classe secteurResult :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Class secteurResult
        Public nomSecteur As String
        Public calJourResult As New System.Collections.Generic.List(Of Calendrier_Jour_Result)
        Public calSemResult As New System.Collections.Generic.List(Of Calendrier_Semaine_Result)
        Public calMoisResult As New System.Collections.Generic.List(Of Calendrier_Mois_Result)
        Public listeEmploy As New System.Collections.Generic.List(Of DataEmploy)
    End Class
    Et j'ai définit plusieurs function pour :
    - Vérifier si un secteur existe déjà dans la collection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Function SecteurEstDansResult(ByVal paramStrSecteur As String) As Boolean
            Dim locIntCompteurSecteur As Integer
            Dim locIntTailleCollgSecteurResult As Integer = collgSecteurResult.Count - 1
            SecteurEstDansResult = False
     
            While ((locIntCompteurSecteur <= locIntTailleCollgSecteurResult) And (SecteurEstDansResult = False))
                If collgSecteurResult(locIntCompteurSecteur).nomSecteur = paramStrSecteur Then
                    SecteurEstDansResult = True
                End If
                locIntCompteurSecteur += 1
            End While
    End Function
    - Récupérer la position d'un secteur dans une collection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Function PosSecteurResult(ByVal paramStrSecteur As String) As Integer
            Dim locIntCompteurSecteur As Integer
            Dim locBoolIsFound As Boolean = False
            Dim locIntTaillecollgSecteurResult As Integer = collgSecteurResult.Count - 1
     
            While ((locIntCompteurSecteur <= locIntTaillecollgSecteurResult) And (locBoolIsFound = False))
                If collgSecteurResult(locIntCompteurSecteur).nomSecteur = paramStrSecteur Then
                    PosSecteurResult = locIntCompteurSecteur
                    locBoolIsFound = True
                End If
                locIntCompteurSecteur += 1
            End While
     End Function
    Je sais qu'il existe des fonctions dédié aux collections afin de savoir si un élément est dans une collection.

    Cependant je ne vois pas comment les utilisés sur des collections d'objets. Dans mon exemple ici je fait ma recherche toujours par rapport à l'élément
    "nomSecteur".

    Comment ,dans une collection d'objet,faire la recherche d'un objet dont le nomSecteur est équivalent à notre paramStrSecteur.

    J'ai trouvé un élément de réponse sur ce poste :
    http://www.developpez.net/forums/d12...et-collection/

    en surchargeant les méthodes d'une classe.

    Je voulais savoir si il y avait d'autres méthode et laquelle serai la plus performante sur les collections d'objet, pas forcément trié, dans lesquels je doit faire des recherche de position, de présences d'objet?

    Je vais essayer d'implémenter la surcharge de la méthodes contains

    je vous tiens au courant

    Merci d'avance pour vos observations et remarques

    ++

  2. #2
    Membre averti Avatar de Sacha999
    Inscrit en
    Mars 2007
    Messages
    294
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mars 2007
    Messages : 294
    Points : 350
    Points
    350
    Par défaut
    Apparemment tu te sers de "nomSecteur" comme d'une clé ou d'un identifiant pour retrouver un élément, dans ce cas pourquoi ne pas passer par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Collections.Generic.Dictionary(Of String, secteurResult)
    ?

    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
     
    'La déclaration
    Public collgSecteurResult As New System.Collections.Generic.Dictionary(Of String, secteurResult)
     
    'L'instanciation
    collgSecteurResult = New System.Collections.Generic.Dictionary(Of String, secteurResult)
     
    'J'ai mis dans ta même fonction, mais elle n'est plus nécessaire
    Public Function SecteurEstDansResult(ByVal paramStrSecteur As String) As Boolean
            Return collgSecteurResult.ContainsKey(paramStrSecteur)
    End Function
     
    'Cette fonction ne retourne plus l'indice (Integer), mais directement l'objet (secteurResult)
    Public Function PosSecteurResult(ByVal paramStrSecteur As String) As secteurResult
            If Not collgSecteurResult.ContainsKey(paramStrSecteur) Then
                  Return Nothing
            Else
                  Return collgSecteurResult.Item(paramStrSecteur)
            End If
    End Function
    Le forum c'est trop génial

  3. #3
    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
    En supposant que tu utilises VB2008 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim nomRecherché As String = "toto"
     
    ' Tester si l'élément existe dans la collection :
    If collgSecteurResult.Exists(Function(s) s.nomSecteur = nomRecherché) Then
    ...
    End If
     
     
    ' Récupérer la position de l'élément
    Dim index As Integer = collgSecteurResult.FindIndex(Function(s) s.nomSecteur = nomRecherché)
    Si c'est une version plus ancienne de VB, c'est un peu plus compliqué car les expressions lambda et délégués anonymes ne sont pas supportés, et tu ne peux donc pas profiter de la capture des variables locales...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    et merci pour vos réponse.
    Apparemment tu te sers de "nomSecteur" comme d'une clé
    En effet il s'agit bien d'une "clé" les secteurs étant unique.

    Et je viens de relire le cours de plasserre et ca semble correspondre à ce que je veux.

    Les manipulations sur les dictionnaires sont-elles identique, au manipulation de collection de list(of)?

    Est-ce que la clé, ici le secteur, doit toujours apparaitre dans la définition de ma classe, ou est-ce un élément propre à la collection?

    Je vais faire des tests voir comment cela fonctionne.

    En supposant que tu utilises VB2008 :
    Je travaille en effet sur Microsoft Visual Basic 2008 express.

    les expressions lambda et délégués anonymes
    Je ne connaissais pas du tout ce type de function, je vais faire quelque recherche la dessus

    La notation est déroutante aussi :

    Function(s)
    s paramètre de la function ? est-ce un alias pour représenter un élément de la collection, et est-ce que la recherche est effectué sur chaque élément de la collection.

    En tout cas j'ai bien fait de poser la question.

    Encore merci pour vos réponse.

    Je vais faire quelque petite recherche

    ++

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    Je viens de faire une petite recherche sur les expressions lambda.

    Même si j'ai pas tout compris, j'en ai compris le concept.

    Il y a un article intéressant dans les 4 liens de cette article :

    http://msdn.microsoft.com/fr-fr/magazine/cc163362.aspx

    Quoiqu'il en soit je pense que je devrais les relire plusieurs fois avant de bien tout saisir.

    Y a cependant une question qui me préoccupe quelle est la solution la plus propre, entre la solution des dictionnaires et l'utilisation des expressions lambda. Quelles sont leur avantage et inconvénient? dans quelles situations l'une est meilleure que l'autre?

    bon je vais tester les expressions lambda

    ++

  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 narutobaka Voir le message
    Les manipulations sur les dictionnaires sont-elles identique, au manipulation de collection de list(of)?
    Non, c'est différent. Un Dictionnaire est fait pour accéder à un élément selon sa clé, en temps constant (complexité O(1)). Une liste doit être parcourue élément par élément pour rechercher celui qui a la clé recherchée, donc c'est plus long (complexité linéaire, O(n))

    Citation Envoyé par narutobaka Voir le message
    Est-ce que la clé, ici le secteur, doit toujours apparaitre dans la définition de ma classe, ou est-ce un élément propre à la collection?
    Dans un dictionnaire la clé n'est pas forcément présente dans la valeur. Par exemple si tu fais un Dictionary(Of String, Integer), ça associe une chaine de caractères à chaque entier, mais la chaine n'est bien sûr pas un membre de l'entier... Donc ça peut être un élément propre à la collection, ou un membre de ta classe. Si c'est un membre de la classe tu peux très facilement générer un dictionnaire à partir d'une liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim dicSecteurs As Dictionary(Of String, secteurResult) = collgSecteurResult.ToDictionary(Function(s) s.nomSecteur)
    L'expression lambda passée en paramètre indique quel membre est utilisé comme clé

    Citation Envoyé par narutobaka Voir le message
    s paramètre de la function ? est-ce un alias pour représenter un élément de la collection, et est-ce que la recherche est effectué sur chaque élément de la collection.
    Oui, le paramètre de l'expression lambda correspond à un élément de la collection. C'est une fonction qui est évaluée pour chaque élément de la collection et renvoie True ou False selon que la condition soit remplie ou pas

    Citation Envoyé par narutobaka Voir le message
    Y a cependant une question qui me préoccupe quelle est la solution la plus propre, entre la solution des dictionnaires et l'utilisation des expressions lambda. Quelles sont leur avantage et inconvénient? dans quelles situations l'une est meilleure que l'autre?
    Ca dépend de ce que tu veux faire avec... Comme je l'ai dit plus haut, un dictionnaire est plus performant qu'une liste si tu recherches l'élément selon la clé. Par contre si tu veux conserver les éléments dans un ordre précis, le dictionnaire n'est pas adapté car l'ordre des éléments n'est pas défini (contrairement à une liste). Donc si tu vas souvent accéder à un secteur selon sa clé, le dictionnaire est plus efficace...

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Merci Thomas encore...
    Citation Envoyé par tomlev Voir le message
    En supposant que tu utilises VB2008 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim nomRecherché As String = "toto"
     
    ' Tester si l'élément existe dans la collection :
    If collgSecteurResult.Exists(Function(s) s.nomSecteur = nomRecherché) Then
    ...
    End If
     
     
    ' Récupérer la position de l'élément
    Dim index As Integer = collgSecteurResult.FindIndex(Function(s) s.nomSecteur = nomRecherché)
    Si c'est une version plus ancienne de VB, c'est un peu plus compliqué car les expressions lambda et délégués anonymes ne sont pas supportés, et tu ne peux donc pas profiter de la capture des variables locales...


    Ce code m'a encore beaucoup aidé: MERCI Thomas de nouveau

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

Discussions similaires

  1. [Débutant] Vérifier la présence d'un objet dans une collection.
    Par DavidLarochelle dans le forum C#
    Réponses: 8
    Dernier message: 15/02/2013, 16h12
  2. Réponses: 3
    Dernier message: 09/08/2010, 14h38
  3. Réponses: 10
    Dernier message: 26/01/2009, 09h22
  4. Réponses: 5
    Dernier message: 10/05/2006, 15h47
  5. Réponses: 3
    Dernier message: 24/04/2006, 15h53

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