Trouver un élément dans un ArrayList

_Fabien Messages postés 119 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 28 avril 2008 - 6 mars 2008 à 17:06
_Fabien Messages postés 119 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 28 avril 2008 - 7 mars 2008 à 13:26
Rebonjour,

Voilà, je n'arrive pas à trouver/supprimer un élément dans une ArrayList. Ca fait 2 heures que j'épluche MSDN/forum/codes-sources.

Certes, dans MSDN il me donne ceci :
dim myAL AsNew ArrayList()

myAL.Add("The")

myAL.Add("quick")

myAL.Add("brown")

myAL.Add("fox")

myAL.Add("jumped")

myAL.Add("over")
myAL.Add("the")

myAL.Add("lazy")

myAL.Add("dog")

myAL.Remove("lazy")

Sinon dans MSDN, il y a marqué : Cette méthode détermine l'égalité en appelant [6b112521-3216-1b84-e543-6b5e93d59da3.htm Object.Equals].

Certes, c'est louable, mais ils auraient pu donner un exemple plus complexe. Voici :

dim myAL AsNew ArrayList()
dim objAdr as new adresse ("13 rue pau Huchon", "06000", "Nice", "France")


myAL.Add(new personne(id, nom, prenom, objAdr)

Etc.(j'ajoute x personnes)
myAL.Remove(objPersonne)

Comment je fais pour utiliser le Remove du ArrayList, autrement dit pour supprimer une personne donnée de l'ArrayList ?

Vous me direz et à raison que je pourrais faire une boucle du genre.

for i=0 to myAL.count-1
   if myAL(i).id = idPers ou textBoxIdPers.text
     (...)
  end if
next i

ça marcherait, mais je tiens à faire çà propement. Si Remove ou RemoveAt existe ce n'et pas pour rien. Je rencontre le même problème avec la recherche. Au lieu d'utiliser la méthode Contains, j'ai du me résigner à faire une boucle

Bon en attendant, je vais tester Remove sur des objets simples et etudier Object.Equals que j'avais commencé à faire.

_____________________________________________________________
Coder et coder sont 2 choses différentes. La 1ère consiste à arriver au but coûte que coûte. La 2nde est de trouver la solution de manière élégante.

3 réponses

keke4483 Messages postés 17 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 6 mars 2008
6 mars 2008 à 18:39
Est ce que dans ton cas ce ne serait pas mieu de travailler avec une sortedlist afin de profiter de l'index ?

Dim mySL AsNew SortedList()
DimobjAdrAsNewadresse ("13 rue pau Huchon", "06000", "Nice", "France")

mySL.Add("Keke", new personne(id, nom, prenom, objAdr))
mySL.Add("Second", "World")
mySL.Add("Third", "!")

Après pour récupérer ta valeur :

if mySL.ContainsKey("Keke")
objPersonne = mySL("Keke")
end if


En esperant que ca pourra t'aider et que je ne me sois pas planté xD .

ps: msdn : http://msdn2.microsoft.com/fr-fr/library/system.collections.sortedlist(VS.80).aspx

-=KeKe4483=-
0
_Fabien Messages postés 119 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 28 avril 2008
7 mars 2008 à 10:30
C'est pas bête, mais je dois travailler avec des ArrayList. Merci quand même Keke  Bon je vais potasser. (j'en baille déjà)

_____________________________________________________________
Coder et coder sont 2 choses différentes. La 1ère consiste à arriver au but coûte que coûte. La 2nde est de trouver la solution de manière élégante.
0
_Fabien Messages postés 119 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 28 avril 2008
7 mars 2008 à 13:26
Je sors de MSDN et avec les ArrayList, ce n'est pas la peine de chercher une aiguille dans une botte de fouin : aucune méthode pour çà. Disons que si, mais ça dépend comment ces méthodes sont utilisées (IndexOf, Contains).

J'ai fait plusieurs tests :

(paiement a été importé d'une DLL)
    Sub Main()
        Dim objPmt1 As Paiement
        Dim objPmt2 As Paiement
        Dim alPmt As New ArrayList

        objPmt1 = New Paiement("A", "1") : alPmt.Add(objPmt1)
        objPmt1 = New Paiement("B", "2") : alPmt.Add(objPmt1)
        objPmt1 = New Paiement("C", "3") : alPmt.Add(objPmt1)

        objPmt2 = New Paiement("B", "2")
        'objPmt1 = New Paiement("D", "4")
        'objPmt1 = alPmt(0)
        'objPmt2 = objPmt1
        'MsgBox(alPmt(0).libelle.Contains(objPmt2.libelle).ToString)
        'MsgBox(ReferenceEquals(objPmt2.type, alPmt(1).type)) ' curieux renvoie True
        'MsgBox(ReferenceEquals(objPmt2, alPmt(1))) ' Ici, renvoie False
        'MsgBox(alPmt(0).libelle.Equals(objPmt2.libelle))
        'MsgBox(alPmt.Item(0).GetType.ToString)
        MsgBox(alPmt.IndexOf(objPmt2))
    End Sub

Je m'attendais à ce qu'il renvoie 2 et non -1 (pas trouvé). Si je remplace objPmt2 par objPmt1, comme ceci :

MsgBox(alPmt.IndexOf(objPmt1))

Là ça marche. Après tous les tests réalisés, chaque  item de l'ArrayList (0...N) pointe sur une référence (en mémoire vive ?). Malgré que mon objPmt2 a été défini/instancié de la même façon --> marche pas car adresses différentes. Ca me rapelle le C.
En revanche avec un objPmt2 = objPmt1, ça marche. Sinon, ReferenceEquals(objPmt2.type, alPmt(1).type) --> True marche, mais pas un ReferenceEquals(objPmt2, alPmt(1)) --> False Curieux !

(Bon je parle tout seul ) J'ai appris aussi autre chose en passant : objPmt2 = objPmt1 (objPmt2 ne pointe pas sur objPmt1 du moins au sens du C). La preuve :

Dim objPmt1 As Paiement
Dim objPmt2 As Paiement

objPmt1 = New Paiement("A", "1")
objPmt2 = objPmt1
objPmt1 = New Paiement("B", "2")

MsgBox(objPmt2.libelle) --> renvoie "A" et non "B". Si c'était comme le C, il aurait renvoyé "B".

Bon passons à autre chose, sauf qi quequ'un a une soluce.

_____________________________________________________________
Coder et coder sont 2 choses différentes. La 1ère consiste à arriver au but coûte que coûte. La 2nde est de trouver la solution de manière élégante.
0
Rejoignez-nous