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.NET1.1]Comment vérifier existence objet dans collection?


Sujet :

VB.NET

  1. #1
    Membre habitué Avatar de Angath
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 140
    Points : 174
    Points
    174
    Par défaut [VB.NET1.1]Comment vérifier existence objet dans collection?
    Bonjour,

    J'ai une class représentant une collection d'objets personnalisés qui hérite de system.collections.arrayList.

    Voici l'implémentation de ma collection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     Public Class JourFeries
        Inherits System.Collections.ArrayList
     
        Public Shadows Sub Add(ByVal aJourFerie As JourFerie)
                 MyBase.Add(aJourFerie)
        End Sub
     
        Default Public Shadows ReadOnly Property Item(ByVal index As Integer)
            Get
                Return (CType(MyBase.Item(index), JourFerie))
            End Get
        End Property
    J'aimerais tester avant d'ajouter un objet dans ma collection, si ce dernier est déjà présent. J'ai donc fait ca dans ma méthode Add :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Public Shadows Sub Add(ByVal aJourFerie As JourFerie)
            If MyBase.Contains(aJourFerie) = False Then
                MyBase.Add(aJourFerie)
            Else
                Throw New Exception("Le jour férié : " & aJourFerie.DateDuJour.ToShortDateString & " est déjà déclaré")
            End If
        End Sub
    La fonction "Contains" testant si l'instance de mon object est déjà dans la collection ben ca marche pas vu que mon objet est une nouvelle instance

    En fait j'aimerais que "Contains" teste si obj1.text = obj2.text par exemple.

    Je peut bien entendu parcourir ma collection et tester 1 a 1 tous mes objets avant d'ajouter le nouveau, mais n'y a t'il pas un autre moyen ?

    D'avance merçi

  2. #2
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Je te suggère de dériver directement de CollectionBase

    Par exemple ainsi
    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
     
    Option Explicit On
    Option Strict On
     
    Imports System
    Imports System.Collections
     
    Public Class JourFerie
       '...etc...
    End Class
     
    Public Class JoursFeries
       Inherits CollectionBase
       '...etc...
     
       Public Shadows Property Item(ByVal index As Integer) As JourFerie
          Get
             Return CType(MyBase.List(index),JourFerie)
          End Get
          Set(ByVal Value As JourFerie)
             MyBase.List(index) = Value
          End Set
       End Property
     
       Public Shadows Function Add(ByVal aJourFerie As JourFerie) As Integer
     
          If Not(MyBase.List.Contains(aJourFerie)) Then Return MyBase.List.Add(aJourFerie)
     
       End Function	
     
       '...etc...
    End Class
    Ici je n'ai pas levé d'exception, l'opération ne s'effectue pas simplement.
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  3. #3
    Membre habitué Avatar de Angath
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 140
    Points : 174
    Points
    174
    Par défaut
    Merci de me répondre

    Mais ton code fait pareil que le mien

    J'explique un peu mieux mon problème :

    Mon interface permet de déclarer des Jours Féries. Chaque Jour Férié possède une propiété "DateDuJour as Date" et une autre "Libelle as String".

    Une fois crée, l'objet JourFerie est ajouté à ma Collection.
    Ce que j'aimerais c'est que ma collection soit triée en fonction de la propriétés DateDuJour et interdise l'ajout d'un jour férié dejà existant. (en gros ne pas pouvoir rentrer 2 objet ayant pour Date le 25/12/.. par ex).

    Mon problème c'est que je peux ajouter 2 objets ayant la même date dans ma collection. Ces 2 objets étant des instances différentes, la fonction Contains ne les considere pas égaux (jusque la elle a raison la fonction).

    J'ai eu le même genre de problème avec le tri de cette collection (j'ai dérivé de ArrayList pour utiliser la méthode ".sort").
    Ici même problème, la fonction ".sort" ne sachant pas comment trier mes objets. (Pour ca j'ai trouvé dans MSDN, il suffit d'implementer l'interface Icomparable dans ma classe JourFerie et surcharger la méthode CompareTO).

    Donc y a t'il un moyen pour que la méthode ".Contains" teste si la propriété d'un objet est égale et non pas si l'instance des 2 objets est égale.

  4. #4
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    essai de surcharger la méthode Equals de ton objet JourFerier afin de comparer le text et non pas l'instance elle même

  5. #5
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    En effet cet exemple pourrait convenir pour ta classe JourFerié
    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
    34
    35
    36
    37
    38
    39
    40
     
    Public Class JourFerie
       Implements IComparable
     
       '...etc...
     
       Public Property [Date] As Datetime
          Get
             Return Me.dateVar
          End Get 
          Set(ByVal Value As DateTime)
             Me.dateVar = Value
          End Set 
       End Property
     
       Public Property Text As String
          Get
             Return Me.textVar
          End Get 
          Set(ByVal Value As String)
             Me.textVar = Value
          End Set 
       End Property
     
       Public Function CompareTo(ByVal obj As Object)As Integer Implements IComparable.CompareTo
          If Not(TypeOf(obj) Is JourFerie) Then
             Throw New InvalidCastException("l'objet passé en paramètre " & obj.ToString() & " n'est pas de type JourFerie")
          End If
          Return Me.Date.CompareTo(CType(obj,JourFerie).Date)
       End Function
     
       Public Overloads Overrides Function Equals(ByVal obj As Object)As Boolean
          If Not(TypeOf(obj) Is JourFerie) Then Return False
          Return Me.Date.Equals(CType(obj,JourFerie).Date)
       End Function
     
       Private dateVar As Datetime
       Private textVar As String
     
    End Class
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  6. #6
    Membre habitué Avatar de Angath
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 140
    Points : 174
    Points
    174
    Par défaut
    Effectivement

    Ca correspond à ce que j'ai trouvé dans MSDN ici

    http://msdn.microsoft.com/library/fr...pconequals.asp

    Comme quoi y a tout dans MSDN le plus dur étant de trouver

    Merci à vous

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 17/01/2008, 17h02
  2. Réponses: 4
    Dernier message: 19/06/2007, 10h41
  3. Vérifier existence fonction dans une classe
    Par zoparg dans le forum Langage
    Réponses: 2
    Dernier message: 17/02/2007, 13h29
  4. Comment Manipuler des objets dans une liste de type TList ?
    Par PadawanDuDelphi dans le forum Delphi
    Réponses: 1
    Dernier message: 02/11/2006, 15h40
  5. Réponses: 1
    Dernier message: 08/09/2006, 17h21

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