Site:  Cours VB.net  
1.6.5 Les Collections

            

Une alternative aux tableaux est l’usage de Collection.

0-Exemple simpliste sur la notion de collection.

Il existe par ordre d'apparition :

- 'Collection' de VisualBasic (Collection)

-les classes du Framework non génériques (ArrayList, Stack, Queue, BitArray, HashTable, SortedList, StringCollection)

-les classes de collections génériques de VB 2005 (List, Dictionnary..)

     -les collections HashSet de VB 2008

     

Il est intéressant de classer les collections par fonction:

A- Les Listes

ArrayList

List(Of..) VB 2005

B- Les Dictionnaires

HashTable 

Dictionary (Of..) VB 2005

C- Les Listes-Dictionnaires

SortedList

DictionaryList VB 2005

D- Les Queue et les Queue (Of..)

E- Les Piles: Les Stack et les Stack (Of..)

F- Les Listes chaînées Les LinkedList(Of....) VB 2005 

G- Gestion des  ensembles: Les HashSet  VB 2008

H- Collections travaillant sur les Bits

BitArray

BitVector32

I-Autres

 

 

Une collection fonctionne plutôt comme un groupe d'éléments dans laquelle il est possible d’ajouter ou d’enlever un élément à n’importe quel endroit sans avoir à se préoccuper de la taille de la collection, ni ou se trouve l'élément.

Le nombre d'élément n'est pas défini au départ comme dans un tableau. Dans une collection il n'y a que les éléments que l'on a ajouté.

Les éléments sont repérés grâce à un index ou avec une Clé unique

Les items affichées dans une ListBox donnent une idée concrète de ce qu'est une collection.

 

Exemple simpliste permettant de comprendre la notion de collection:

Soit la collection Col, au départ elle est vide.

J'ajoute des éléments (ou items) à cette collection.

Col.Add ("Toto")

Voici la collection:

Toto

La collection a maintenant 1 élément.

 

Col.Add("Lulu")

Col.Add("Titi")

Toto

Lulu

Titi

La collection a 3 éléments maintenant.

 

Col.Remove(1) enlève le second élément (le numéro 1 )

Toto

Titi

 

Attention le premier élément est l'élément de numéro 0 puis le 1, 2, 3.. jusqu'à n-1,  n étant le nombre d'élément. 

La collection n'a plus que 2 éléments maintenant.

On voit que le nombre d'éléments n'est pas connu à l'avance, il varie en fonction des éléments ajoutés (ou retirés)

Un élément est repéré par son indice.

Col.Item(1) contient "Titi" (le second Item de la collection)

Remarque:

J'ai pris une collection de 'Base 0': le premier élément à l'indice 0; c'est du .Net. Il existe aussi des collections (celles venant des classes Visual Basic) de Base 1.

On vient de voir une List, il existe aussi les dictionnaires ou on retrouve les éléments par une clé.

 

A- Les Listes: ArrayList  et  List(Of..).

Ce sont des collections sous forme de Liste, comme dans l'exemple simpliste. On a un Index pour repérer les éléments.(Pas de clé)

1-ArrayList:Liste d'objets

Fait partie de System.Collections 

Il faut donc ajouter en haut du module:

                 Imports System.Collections

La ArrayList est une collection particulière: On peut y mettre des objets : chaînes, nombres… rien n’empêche que le premier élément soit un entier, le second une chaîne…

Il n'y a pas de clé.

 

Bonjour

Toto

Lulu

 

Attention le premier élément est  l'élément 0 (l'index va de 0 à count-1) ; c'est du .NET!!

Dim L As New ArrayList()     'On crée une collection ArrayList

Dim L As ArrayList = ArrayList.Repeat("A", 5)

'On crée une ArrayList de 5 éléments contenant chacun  "A" (on répète "A")
 

L.Add("Bonjour")             'On ajoute un élément à la collection

MsgBox(L(0))      'On affiche le premier élément

ou MsgBox(L.Item(0)) 

Honte à moi j'avais écrit MsgBox(L(0).Item)

 

      MsgBox(L.Count.ToString)     'On affiche le nombre d’élément.

Attention c'est le nombre d'éléments. S'il y a 3 éléments dans la ArrayList ce sont les éléments d'index 0,1,2.

      L.Remove("Bonjour")          'On enlève un élément de la liste, celui qui contient "Bonjour"

      L.RemoveAt(0)                'On enlève l’élément d'index 0 de la liste

      L.Sort()                     'Trie la collection

L.Clear()                    'Efface tous les éléments

      L.Contains (élément)        ' Retourne True si la liste contient 'élément'.  

Insert permet d’insérer à un index spécifié.

            L.Insert( position, Ainserrer)

      InsertRange insère une ArrayList dans une Autre ArrayList.

      

 

Recherche d'un élément dans une collection NON TRIEE avec IndexOf:

 

Dim l As New ArrayList

Dim i As Integer

l.Add("toto")

l.Add("lulu")

i = l.IndexOf("lulu")

MsgBox(i.ToString)    'Affiche 1 qui est l'index de "lulu" dans la collection.

 

On rappelle qu'il existe aussi LastIndexOf qui démarre par la fin et une surcharge permettant de débuter la recherche à partir d'un indice donné (i = l.IndexOf(3,"lulu") recherche à partir du 3ème élément).

    

ToArray

 

Recherche d'un élément dans une collection TRIEE avec BinarySearch:

 

Dim l As New ArrayList

Dim i As Integer

l.Add("toto")

l.Add("lulu")

l.Sort()'Il est nécessaire que le tableau soit trié

i = l.BinarySearch("lulu")

MsgBox(i.ToString)

La recherche est plus rapide mais il faut que la collection soit triée.

Pour parcourir une collection, 3 méthodes :

-Avec l’index de l’item

Dim i As Integer

Dim A As String

For i=0 to L.Count-1

      A=L.Item(i)

Next i

NB: Comme vu plus haut, on utilise Count pour trouver le nombre d'élément, aussi la boucle doit balayer de 0 à count-1.

-Avec For Each

Dim o As Objet

For Each o in L

      MsgBox(o)

Next

Attention A est un objet, si je veux l'afficher par exemple, il faut le 'caster' en String:  

Dim s As String= CType(A,String)

-Avec l'objet IEnumerator (débutant passe ton chemin)

On crée un objet C de type IEnumerator pour parcourir la collection, cet objet a 3 propriétés:

MoveNext qui avance d'un élément dans la collection. S'il ne peut plus avancer (s'il est déjà après le dernier) il retourne False

Reset qui place l'élément courant au début, avant le premier élément (Comme au départ)

Current désigne l'élément courant.

Exemple montrant la seule manière de faire pour parcourir la collection:

Dim L As New ListArray

Dim C As IEnumerator= L.GetEnumerator()

While C.MoveNext())

     A=C.Current

End While

-Attention, si Option Explicit=On

Les éléments de la ListArray étant des objets, on ne peut pas les affecter à une variable String par exemple, il faut écrire:

Str = CType(L(0), String)    'on convertit (on cast) l'objet en String.

Remarque:

L.Add(Nothing)    'est accepté: on ajoute un élément vide

 

2-List (Of..):Liste Générique typée

Avant VB 2005 on avait des collections qui pouvaient contenir ce qu'on voulait; ArrayList pouvait contenir par exemple des objets.

A partir de 2005 on a des collections que l'on peut typer, c'est à dire qu'elles ne pourront contenir qu'un type de donnée, que des String, des entiers, des instances de telle classe... On parle de collections génériques. Le terme Of permet de définir le type de la collection.

Dim lst As New List (Of Decimal)  crée une liste ne contenant que des 'decimal'.

Nécessite:

Imports System.Collections.Generic

 

La Collection List (Of..)

C'est comme une ArrayList mais elle est typée. Le type indiqué après Of indique le type de la collection.

 

Toto

Lulu

Titi

 

Exemple: créons une collection de String List(Of String): Elle est typée car elle ne peut contenir que des 'String'.

Dim lst As New List(Of String)

 

Il s'agit d'une List avec Index.

lst(0)  est le premier élément.

ou lst.item(0)    PAS lst(0).Item

On ajoute une string:

lst.Add("toto")    

 

Dim S As String = lst.Item(0) ' l'item est bien typé : même avec 'Option Strict=on' pas besoin de CType.

 

Nombre d'éléments de la list:

lst.Count

 

La liste contient t-elle "toto"?

Dim present As Boolean =lst.Contains("toto")

 

Insérer un élément à une position donnée:

lst.Insert(2, "lulu") 

 

Parcourir tous les éléments et les afficher:

For Each element As String In lst 

    Console.WriteLine(element) 

Next

 

Rechercher un élément dans la liste:

lst.IndexOf("lulu") retourne l'index de l'élément qui contient "lulu" 

lst.IndexOf("lulu", 2,7) recherche à partir de l'élément 2 et sur 7 éléments.

Il existe aussi LastIndexOf

Sur un tableau trié on utilise BinaryScearch.

 

Rechercher tous les éléments qui répondent à une condition: lst.FindAll

J'ai une liste lst, je veux mettre dans listerecherche tous les éléments de lst qui se terminent par 'lu'.

'on crée une liste (listerecherche) qui grâce à FindAll se chargera des éléments de lst qui répondent à une condition:

Dim listrecherche As List(Of String) = lst.FindAll(AddressOf SeTermineParLU) 

 

'en argument de FindAll on a l'adresse d'une fonction: ici la fonction 'SeTermineParLU'. Pour chaque élément de lst si SeTermineParLU retourne True, l'élément correspondant est passé dans  listerecherche

 

'on affiche listerecherche sur la console.

For Each s As String In listerecherche

  Console.WriteLine(s) 

Next

 

 

'voici la fonction de teste

Private Shared Function SeTermineParLU (ByVal s As String) As Boolean 

If (s.Length > 2) AndAlso  (s.Substring(s.Length - 2).ToLower() = "lu") Then

     Return True 

Else 

    Return False 

End If 

End Function

 

Trier:

lst.sort

 

B- Dictionnaire basé sur le hashage:

Un dictionnaire est une collection avec les clés permettant de retrouver des valeurs.

La HashTable contient des objets, le Dictionary est une collection générique.

Voir le cours sur l'algorithme pour comprendre ce qu'est un 'hachage' ou (hashage).

1-HashTable

C'est un 'Dictionnaire' qui comporte des couples clé-élément, des paires clé-valeur (Objet, Objet).

La clé toujours unique permet de retrouver la valeur: 2 clés ne peuvent être égales.

La clé ne doit pas être vide non plus. Par contre il peut y avoir plusieurs fois la même 'valeur'.

H.Add(Clé,Valeur)       Ajoute un élément

H.Item(Clé)             Retourne l’élément correspondant à une clé.

H(Clé)                  Retourne l’élément correspondant à une clé (Item peut être omis car c'est la propriété par défaut).

H.ContainsKey(Clé)      Retourne True si la Clé est dans la table.

Cela permet de tester si la clé existe déjà avant de faire un Add:

                                        If Not H.ContainsKey("ht") Then

                         H.Add("ht", "hypertrm.exe")

                 End If

H.ContainsValues(Valeur)Retourne True si la valeur est dans la table.

H.Clear                 Efface tous les éléments

H.Remove(Clé)           Supprime l'élément ayant une clé spécifiée.

Les collections H.Values et H.Keys contiennent les valeurs et les clés.

 

Pour parcourir la HashTable, on utilise une boucle For Each;  le couple Key Value étant de type DictionaryEntry.

For Each de As DictionaryEntry In H

  Console.WriteLine("Key = {0}, Value = {1}",  de.Key, de.Value) 

Next de

Attention on n'utilise pas de numéro d'index mais uniquement la clé.

 

Exemple:

'  Creation d'une Hashtable.
Dim myHT As New Hashtable()

' Mettre des éléments dans la HashTable
myHT.Add("un", "premier")
myHT.Add("deux", "second")
myHT.Add("trois", "troisième")
myHT.Add("quatre", "quatrième")
 

'Recherche la valeur correspondant à la clé "trois"

myReponse=myHT.Item("trois")     'Retourne "troisième"
 

'Parcourir la HashTable

'Création d'un IDictionaryEnumerator
Dim myEnumerator As IDictionaryEnumerator = myHT.GetEnumerator()

While myEnumerator.MoveNext()

'Afficher clé et valeur
    MsgBox( myEnumerator.Key+ myEnumerator.Value)
End While

 

En interne, pour chaque élément, la clé est 'hachée' pour créer un code de hashage qui sert à pointer l'élément et sa valeur.

 

2-Dictionary(Of..) Dictionnaire générique avec Clé et valeur 

A partir de VB 2005.

La clé doit être unique (pas de doublon de clé).    

La récupération d'une valeur à partir de sa clé est très rapide.(Utilisation d'un hachage)

Of permet de choisir le type de la clé et celui des valeurs.

    Dim Dic As New Dictionary(Of String, String) 

' Ajout d'élément

     Dic.Add("txt", "notepad.exe") 

     Dic.Add("bmp", "paint.exe")

' Ajout d'élément en vérifiant avant si la clé n'existe pas    

    If Not Dic.ContainsKey("ht") Then

         Dic.Add("ht", "hypertrm.exe")

    End If 

' Modifier la valeur correspondant à la clé 'doc'

Dic("doc") = "winword.exe"

 'Parcours du Dictionary (le type de clé/Value est KeyValuePair). 

For Each kvp As KeyValuePair(Of String, String) In Dic

     Console.WriteLine("Key = {0}, Value = {1}",  kvp.Key, kvp.Value) 

Next kvp

' Récupérer une valeur correspondant à une clé

Dic("rtf")

'TryGetValue permet de rechercher une valeur correspondant à une clé, retourne False si la clé n'existe pas (sans déclencher d'erreur).

Dim value As String = "" 

If Dic.TryGetValue("tif", value) Then

     Console.WriteLine("For key = ""tif"", value = {0}.", value)

 Else

     Console.WriteLine("Key = ""tif"" non trouvée.") 

End If

Dic..ContainsKey("ht") permet aussi de tester si une clé existe.

'Enlever un élément

Dic.Remove("doc")

 

C- Collection combinant les dictionnaires et les List.

Pour trouver un élément on peut utiliser une clé ou un Index et la collection est triée automatiquement.

1-SortedList:

Il permet l'accès aux valeurs par l'intermédiaire des clés associées ou des index.

C'est un hybride de HashTable et de Array.

On ajoute un élément par mySL.Add(Clé,Valeur)

La séquence d'index est basée sur la séquence de tri. Quand un élément est ajouté, il est inséré dans l'ordre de tri adéquat, et l'indexation s'ajuste en conséquence. Le tri est donc automatique.

On peut donc lire une valeur par sa Clé ou son Index++++:

mySL.Item(CLE) 'retourne la valeur correspondant à la clé CLE

mySL.GetKey(3) 'retourne la Clé qui est dans l'élément d'index 3

mySL.GetByIndex(3) 'retourne la valeur qui est dans l'élément d'index 3
 

SortedList maintient en interne deux tableaux , un tableau pour les clés et un autre pour les valeurs associées.

Index de base 0: Le premier élément est 0.

Exemple:

Dim mySL As New SortedList()
mySL.Add("1", "Hello")
mySL.Add("2", "World")
mySL.Add("3", "!")


Console.WriteLine(" Count: {0}", mySL.Count)   
'Nombre d'éléments
Console.WriteLine(" Capacity: {0}", mySL.Capacity)
'nombre d'éléments possible mais il augmente automatiquement, on n'a pas à s'en occuper.
 

Dim i As Integer
For i = 0 To mySl.Count - 1
    Console.WriteLine( myList.GetKey(i)& myList.GetByIndex(i))
 'affiche les éléments de la collection

                                                                ' par index croissant.
Next i
 

Les SortedList(Of..).. générique avec Clé et valeur ,trié sur la clé. Ressemble à SortedDictionary, mais occupe moins de mémoire et est moins rapide pour les insertions/suppressions.

 

2- Les  SortedDictionnary(Of..) avec Clé et valeur ,trié sur la clé.

 

 

 

D- Les Queue: 

Collection d'objets de type FIFO (First In, First Out)

Premier arrivé premier servi.

C'est la queue devant un cinéma, le premier arrivé, prend son billet le premier.

Les objets (String, Integer,....) stockés dans Queue sont insérés à une extrémité et supprimés à l'autre.

    Le nombre d'élément de la queue est géré automatiquement.

DeQueue supprime et retourne l’objet de début de liste

EnQueue ajoute un objet en fin de liste

Peek retourne l’objet de début sans le supprimer

 

Dim myQ As New Queue()
myQ.Enqueue("One")
myQ.Enqueue("Two")
myQ.Enqueue("Tree")


Console.WriteLine ( myQ.Count)
'Affiche le nombre d'éléments.
 

Console.WriteLine (myQ.Dequeue()) 'Affiche le premier sorti en le sortant. "one" dans notre exemple.
'S'il n'y a plus d'élément cela lève une exception (une erreur), il faut donc gérer l'exception ou contrôler le nombre d'élément avec la propriété Count.

If MyQ.Count>0 then

    myQ.Dequeue..

End If

Console.WriteLine (myQ.Peek()) 'Affiche le premier élément sans l'enlever de la Queue
 

myQ.Clear() 'Efface tous les éléments de la queue

Les Queue(Of..) Comme les Queue mais avec un généric

 

 

 

E- Les Stack:

Collection d'objets de type pile ( ou stack) LIFO (Last In, First Out)

Dernier entré, premier sortie.

Ce type de stack (pile) est très utilisé en interne par les programmes informatiques: on stocke dans une stack les adresses de retour des procédures appelées, au retour on récupère l'adresse du dessus.

Push insère un objet en haut de la pile

Pop  enlève et retourne un objet en haut de la pile

On peut utiliser une pile dans un programme pour gérer le déplacement de l'utilisateur dans un arbre, les éléments en cours sont stockés par Push, pour remonter en chemin inverse, on Pop.

Attention le premier élément est ici l'élément 1 (élément d'index 1 à count) A vérifier!!

Exemple:

Dim MaPile As New Stack()

Dim Str As String

'Ajouter des éléments à la pile

MaPile.Push ("A")

MaPile.Push ("B")

MaPile.Push ("C")

'Récupérer un objet de la pile:

 Srt =MaPile.Pop()

Str est maintenant égal à "C"

Attention, si Option Explicit=On, les éléments de la pile étant des objets, on ne peut pas les affecter à une variable String, il faut écrire:

Str = CType(MaPile.Pop(), String)    'on convertit (cast) l'objet en String

 

Si la pile est vide et que l'on 'Pop', une exception  non gérée du type 'System.InvalidOperationException' se produit.(une erreur se produit et cela plante!!), là aussi vérifier que MaPile.Count (qui indique le nombre d'éléments dans la pile) n'est pas égale à 0 avant de 'Poper'.

Mapile.Clear()     'Supprime tous les objets.

 

Les Stack(Of..) Comme les track mais avec un généric

 

F- Les LinkedList(Of..)  

Liste Chaînée de générique , chaque élément comportant une propriété Value, Next et Previous. A partir d'un élément, on peut connaître le suivant ou le précédent.

 

Imports System.Collections.Generic 

' Création d'une list. 

Dim words() As String = {"the", "fox", "jumped", "over", "the", "dog"} 

' Création d'une Linkedlist. 

Dim lk As New LinkedList(Of String)(words)

 Ajouter le mot 'today' au début.

 lk.AddFirst("today")

'Effacer le dernier élément.

 lk.RemoveLast()

'Les éléments sont des LinkedListNode, on peut en chercher un avec Find FindFirst, FindLast.

Dim current As LinkedListNode(Of String) = lk.FindLast("the")

 

'A partir de l'élément courant, on peut ajouter avant ou après.

lk.AddAfter(current, "old")  'il y a aussi AddBefore

'A partir de l'élément courant, on peut parcourir la linkedList

Dim element As LinkedListNode(Of String) = current.Previous  'il y a aussi Next

'On peut déplacer un élément

lk.AddBefore(current, element)

'On peut voir le contenue d'un LinkedListNode

current.Value

current.Previous.Value

'on peut voir la valeur du premier ou du dernier élément:

lk.First.Value

lk.Last.Value

'Il existe aussi

Containst, Count

 

 

 

G-Les HashSet' en VB 2008

Travailler sur les ensembles.

Il s'agit d'une collection sans ordre qui contient des éléments uniques. HashSet  possède comme toutes les collections Add, Remove et Contains.. et fournit plusieurs opérations d'ensembles (notamment l'union, l'intersection et la différence symétrique)ce qui permet de prendre en charge la plupart des opérations mathématiques qui sont généralement réalisées sur des ensembles (sens mathématique du terme).

Dim hs As New HashSet(Of String)

Ajout d'éléments:

hs.Add("toto")

hs.Add("lulu")

hs.Add("titi"

La méthode Add renvoie True ou False pour indiquer si elle a fonctionné (s'il n'y avait pas déjà dans la HashSet l'élément que l'on veut ajouter).

Dim caMarche As Boolean = hs.Add("toto")  'retourne False

 

hs.Count donne le nombre d'élément.

 

On peut effacer un élément:

hs.Remove("lulu")

On peut effacer sous condition:

Exemple: effacer tous les éléments contenant un "t":

hs.RemoveWhere( Adress Of Test)

'La fonction Test reçoit chaque string de la table et retourne un booléen qui indique si la condition est rempli ce qui déclenche le Remove.

Private Shared Function Test(ByVal s As String) As Boolean 

    Return (Instr(s,"t")<>0)

End Function

 

On peut ajouter la collection hs2 à hs grâce à UnionWith:

hs.UnionWith(hs2)

Les éléments doublons (qui existent déjà dans hs ne sont pas ajoutés.

Cela correspond à un And.

On peut rechercher les éléments commun à hs2 et à hs grâce à IntersectWith:

hs.IntersectWith(hs2)

hs contient  maintenant les éléments qui étaient présent dans hs et hs2

Cela correspond à un Or.

 

Supprime tous les éléments de hs qui sont aussi contenus dans la collection passée en paramètre (hs2) avec ExceptWith 

hs.ExceptWith(hs2)

hs contient  maintenant les éléments qui n'étaient pas présent dans hs et hs2

 

On peut rechercher les éléments contenus dans hs2 et dans hs mais pas dans les 2 grâce à SymmetricExceptWith:

hs.SymmetricExceptWith(hs2)

hs contient  maintenant les éléments qui étaient présent dans hs ou  hs2 mais pas les deux.

 

On peut rechercher si hs2 est un sous ensemble de hs grâce à IsSubsetOf:

Dim b As Boolean= hs.IsSubsetOf(hs2)

b est égal à True si hs est un sous ensemble de hs2 (tous les éléments de hs sont dans hs2).

Il existe aussi:

IsProperSubstOf qui retourne True si hs est un sous ensemble de hs2 et si hs différent de hs2  (sous ensemble strict)

 

On peut rechercher si  hs est un sur ensemble de hs grâce à IsSupersetOf:

Dim b As Boolean= hs.IsSupersetOf(hs2)

b est égal à True si hs est un sur ensemble de hs2 (tous les éléments de hs2 sont dans hs).

Il existe aussi:

IsProperSupersetOf qui retourne True si hs est un sur ensemble de hs2 et si hs est différent de hs2  (sur ensemble strict)

 

 

H- Collection travaillant sur les Bits.

BitArray permet de travailler sur un nombre quelconque de Bit.

BitVector32 ne permet de travailler que sur 32 bits mais est plus rapide.

1- BitArray:  

Necessite:

Imports System.Collection

Crée une collection de booléens (codés sur un bit). La valeur de chaque élément est True ou False.

BitArray permet de travailler sur un nombre quelconque de Booléens ou Bit.

 Creation de BitArray.
Dim myBA As New BitArray(5)   
'BitArray de 5 bits

Dim myBA As New BitArray(5, False)
'BitArray de 5 bits à False

Dim myBA() As Boolean = {True, True, False, False, False}
Dim myBA As New BitArray(myBytes)
'on crée un  tableau de Booleans que l'on met dans le BitArray

Le premier élément est l'élément 0.

On peut mettre tous les bits à True avec SetAll:

myBA.SetAll(True)

' Mettre le dernier Bit à False avec Set.
myBA.Set(myBA.Count - 1, False)
 

'Obtenir la valeur du second Bit

myBA.Get(1)
 

myBA(1) ou myBA.Item(1) donnent aussi la valeur du second Bit.


On peut effectuer des opérations logiques entre 2 BitArray (Or, Xor, And Not):

Exemple pour Or:

myBA1.Or(myBA2)

Count et length donnent le nombre d'éléments, mais count est en lecture seule, Length permet, lui, de modifier le nombre d'éléments.

 

2- BitVector32:  

Ne permet de travailler que sur 32 bits mais est plus rapide.

Imports System.Collection.Specialized

 

I- Autres collections:

 

Collections spécialisées:

L'espace System.Collections.Specialized fournit de nouveaux types de collection très spécifiques, elles ne sont faites que pour un seul type:

StringCollection: 

Ne peut contenir que des chaînes (cela devrait aller plus vite)

 

"Toto"

"Lulu"

"Titi"

 

' Créer une StringCollection.
Dim myCol As New StringCollection()

'Créer un tableau de String, l'ajouter( en fin) à la collection.
Dim myArr() As [String] = {"rouge", "vert", "orange", "vert",)
myCol.AddRange(myArr)


'Ajouter un élément à la fin de la collection
myCol.Add("marron")

'Insérer un élément à l'index 3
myCol.Insert(3, "bleue")

'Enlever une élément
myCol.Remove("orange")


' chercher et enlever tous les éléments "vert"
Dim i As Integer = myCol.IndexOf("vert")
While i > - 1
 myCol.RemoveAt(i)
 i = myCol.IndexOf("vert")
End While

' La collection contient t'elle "jaune"?
If myCol.Contains("jaune") Then..

' Copie la collection dans un tableau.
Dim myArr2(myCol.Count) As [String]
myCol.CopyTo(myArr2, 0)


' Efface toutes les strings de la Collection.
myCol.Clear()
 

'Afficher la liste des Strings

Dim myEnumerator As System.Collections.IEnumerator = myCol.GetEnumerator()

While myEnumerator.MoveNext()
  Console.WriteLine(" {0}", myEnumerator.Current)
End While

'C'est un peu complexe!! on y reviendra.
Attention le premier élément est ici l'élément 0 (l'index va de 0 à count-1) ; c'est du .NET!!

 

Intérêts de ses collections est qu'elle sont fortement typées: Elle n'acceptent que des éléments d'un type: des String dans le dernier exemple. 

SortedDictionary

 

L'objet 'Collection' c'est du VisualBasic: A eviter.

'Collection' existait déjà en VB6!!

Utiliser plutôt les collections du Framework.

L'objet collection utilise un couple Clé-Valeur, pour chaque élément.

Ici le premier élément a pour clé: 69, pour valeur:'Rhône'

C'est pratique car cela permet de retrouver une valeur à partir de la clé.

Pour utiliser une collection d'objets, vous devez premièrement créer l'objet maCollection.  

Dim maCollection As New Collection

Dès que cet objet est créé, vous pouvez ajouter (avec Add), enlever ou manipuler des éléments.

On utilise la syntaxe: NomCollection.Add( élément, Clé)

maCollection.Add("Bonjour", "30")

maCollection.Add("Monsieur", "31")

maCollection.Add("Et", "32")

maCollection.Add("Madame", "33")

Il peut y avoir 2 autres paramètres:

maCollection.Add(Element, Clé, Before, After)

Before ou After peuvent être utilisés pour placer l'élément à insérer avant ou après un élément de la collection. Si Before ou After est un nombre c'est l'index des éléments qui est utilisé, si c'est une string c'est la clé.

Pour récupérer un objet de la collection, on peut utiliser

Label1.Text = maCollection.Item(2) 'Affiche le second élément: Monsieur

Attention le premier élément est ici l'élément 1 (l'index  va de 1 à Count); c'est hérité du VB!!

Label1.Text = maCollection.Item("33") 'Affiche Madame

 

Pour effacer un objet de la collection, on peut utiliser

maCollection.Remove(2) 'Efface le second élément: Monsieur

 

maCollection.Remove("33") 'Efface Madame

 

On peut utiliser For each pour parcourir la Collection:

For Each S As string In maCollection

    MsgBox(i)

Next S

 

Remarque pour les 'bons':

Noter que Collection peut contenir des Objets donc n'importe quoi.

Label1.Text = maCollection.Item(2)

Est accepté si Option Strict=Off car il y a y a conversion implicite.

Si Option Strict=On, il faut écrire:

Label1.Text = CType(maCollection.Item(2), String) pour convertir explicitement l'objet en String

 

Pourquoi le premier élément est 0 ou 1?

Le .NET Framework normalise les collections comme étant des collections de base zéro (ArrayList par exemple). Les Collections de Visual Basic  fourni des collections de base 1.

 

 

 Généralisation de la notion de collection.

Certains objets ont une liste de données, d'items, Vb les organise en Collections.

Une collection peut donc faire partie des  propriétés d'un objet.

Exemple:

On verra plus loin qu'un contrôle nommé TextBox peut contenir du texte, ce contrôle à une collection nommée .lines qui contient chaque ligne du texte (s'il y en a plusieurs)

Si le texte contient 3 lignes, elles seront dans la collection .lines

Texbox1.lines(0)    'remarquer, ici le premier élément est 0!!

Textbox1.lines(1)

Textbox1.lines(2)   

L'indice des éléments va de 0 à count-1

Autres exemple:

Les contrôles ListBox possèdent une collection Items dans laquelle est placé tous les éléments contenus dans la liste. Pour ajouter un élément on utilise la méthode Add de la collection Items: ListBox.Items.Add( )

Un tas d'objets possèdent des collections.

Encore plus: chaque formulaire possède une Collections Controls. Il s'agit d'une collection qui contient tous les contrôles de ce formulaire.

Exemples sur les collections:

Créer une ArrayList, une queue, ajouter la queue à la  ArrayList, chercher un  élément, insérer un élément.

Les collections font partie de l'espace de nom Systeme.Collections

Imports System.Collections


' Créer une ArrayList.
Dim myAL As New ArrayList()
myAL.Insert(0, "un")
myAL.Insert(1, "deux")

' Créer une Queue.
Dim myQueue As New Queue()
myQueue.Enqueue("trois")
myQueue.Enqueue("quatre")



' Copies la Queue dans ArrayList à l'index 1.
myAL.InsertRange(1, myQueue)


' Chercher "deux" et ajouter "moins de deux" avant .
myAL.Insert(myAL.IndexOf("deux"), "moins de deux")


' Ajouter "!!!" à la fin.
myAL.Insert(myAL.Count, "!!!")
 

 

 

 

Lexique anglais=>Français:

Array = tableau, table.

lenght= longueur

Key= clé

Remove (to)= enlever

Stack= tas