Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

22.7. System.Collections.ArrayList

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

22.7.1. System.Collections.ArrayList

In onderstaand voorbeeld zie je hoe een aantal members van het ArrayList type worden gebruikt :
Visual Basic 2012 Broncode - Codevoorbeeld 532
Class Example3
    Public Shared Sub Main()
        Dim arrayList1 As New System.Collections.ArrayList                 ' (1)
        '
        Console.WriteLine(arrayList1.Capacity)   ' 0                         (2)
        Console.WriteLine(arrayList1.Count)      ' 0                         (3)
        '
        arrayList1 = New System.Collections.ArrayList(2)                   ' (4)
        Console.WriteLine(arrayList1.Capacity) ' 2
        '
        arrayList1.Add(1)                                                  ' (5)
        arrayList1.Add("2"c)
        Console.WriteLine(arrayList1.Capacity) ' 2
        arrayList1.Add("three")
        Console.WriteLine(arrayList1.Count)    ' 3
        Console.WriteLine(arrayList1.Capacity) ' 4
        '
        arrayList1.AddRange(New Integer() {4, 5, 6})                       ' (6)
        PrintArrayList(arrayList1) ' "1 - 2 - three - 4 - 5 - 6 - "
        '
        arrayList1.Remove("2"c)                                            ' (7)
        PrintArrayList(arrayList1) ' "1 - three - 4 - 5 - 6 - "
        arrayList1.RemoveAt(3)                                             ' (8)
        PrintArrayList(arrayList1) ' "1 - three - 4 - 6 - "
        arrayList1.RemoveRange(1, 3)                                       ' (9)
        PrintArrayList(arrayList1) ' "1 - "
        Console.WriteLine(arrayList1.Count)    ' 1
        Console.WriteLine(arrayList1.Capacity) ' 8
        '
        arrayList1.TrimToSize()                                            ' (10)
        Console.WriteLine(arrayList1.Count)    ' 1
        Console.WriteLine(arrayList1.Capacity) ' 1
        '
        arrayList1.AddRange(New Integer() {2, 1, 3})
        Dim searchValue As Object = 1
        Console.WriteLine(arrayList1.Contains(searchValue))    ' True
        Console.WriteLine(arrayList1.IndexOf(searchValue))     ' 0
        Console.WriteLine(arrayList1.LastIndexOf(searchValue)) ' 2
        '
        arrayList1.Reverse()
        PrintArrayList(arrayList1) ' "3 - 1 - 2 - 1 - "
        '
        arrayList1.Sort()                                                 ' (11)
        PrintArrayList(arrayList1) ' "1 - 1 - 2 - 3 - "
        '
        arrayList1.Clear()                                                ' (12)
        Console.WriteLine(arrayList1.Capacity) ' 4
        Console.WriteLine(arrayList1.Count)    ' 0
        '
        Console.ReadLine()
    End Sub
    Public Shared Sub PrintArrayList(ByVal arrayList As Collections.ArrayList)
        'For Each element As Object In arrayList                          ' (13)
        '    If element IsNot Nothing Then
        '        Console.Write(element.ToString() & " - ")
        '    End If
        'Next
        ' Or :
        For index As Integer = 0 To arrayList.Count - 1
            If arrayList.Item(index) IsNot Nothing Then                   ' (14)
                Console.Write(arrayList.Item(index).ToString() & " - ")
            End If
        Next
        Console.WriteLine()
    End Sub
End Class
Console Application Output
0
0
2
2
3
4
1 - 2 - three - 4 - 5 - 6 -
1 - three - 4 - 5 - 6 -
1 - three - 4 - 6 -
1 -
1
8
1
1
True
0
2
3 - 1 - 2 - 1 -
1 - 1 - 2 - 3 -
4
0
(1) : New System.Collections.ArrayList kan vereenvoudigd worden naar New ArrayList indien een Imports is opgenomen naar de System.Collections namespace (door dus bijvoorbeeld de regel Imports System.Collections bovenaan het document te plaatsen).

(2) : De capaciteit van de ArrayList (opvraagbaar en instelbaar), by default is de capaciteit nul, bij het toevoegen van een eerste element wordt de capaciteit vier, bij het toevoegen van het vijfde element wordt de capaciteit verdubbeld (naar acht), bij het toevoegen van het negende element wordt de capaciteit opnieuw verdubbeld (naar zestien), enzovoort ... .

(3) : Het aantal elementen (enkel opvraagbaar), na initialisatie van de ArrayList is dit nul.

(4) : Een andere dan de default capaciteit kan worden meegegeven aan de constructor.

(5) : De Add(value As Object) method verwacht een Object expressie die de waarde voorstelt die moet worden toegevoegd.  Bijgevolg is dit collectietype breed inzetbaar, gezien elementen van alle datatypes hieraan kunnen worden toegevoegd.

(6) : Aan de AddRange() method kan bijvoorbeeld een array worden doorgegeven van welke alle elementen een voor een zullen worden toegevoegd aan de ArrayList instantie.

(7) : Het eerste karakter "2"c zal worden verwijderd.

(8) : Element op index 3 wordt verwijderd.

(9) : Drie elementen startend op index 1 zullen worden verwijderd.

(10) : Zet de capaciteit gelijk aan het aantal elementen.

(11) : De Sort() method zal proberen de elementen met elkaar te vergelijken om ze in een logische volgorde te kunnen (ver)plaatsen.  Niet altijd zal deze vergelijking van de elementen slagen, Person objecten en Integer waarden zijn bijvoorbeeld moeilijk onderling vergelijkbaar, exceptions kunnen dus voorkomen.

(12) : Verwijderd alle elementen, de capaciteit blijft behouden.

(13) : Ook de elementen van een ArrayList zijn met een For Each iteratie  te benaderen.

(14) : Een default indexer Item is beschikbaar om de elementen op een bepaalde indexpositie op te vragen of in te stellen, de Item(index As Integer) property levert een Object expressie op.
Bijgevolg is het mogelijk dat de client van de ArrayList instantie de Item expressie zal moeten casten om aan de members te kunnen uit de interface van eigenlijke element type.

Als men om een collectie te beheren een Array gaat gebruiken, moet men :

- manueel de array uitbreiden voor het toevoegen van elementen, bijvoorbeeld aan de hand van een ReDim statement
- manueel de array doorlopen voor het opzoeken van een waarde
- ...

Of kort gesteld dient men allerhande implementaties te schrijven voor het toevoegen, opzoeken of verwijderen van een element, voor het sorteren of legen van de elementen, ...
Indien men hiervoor een ArrayList gaat gebruiken zijn de meeste van deze implementaties reeds voorzien, en spaart men bijgevolg een pak werk uit.

22.7.2. Oefening

Opgave :

Maak zelf een eenvoudige versie van een ArrayList klasse.

Gebruik een gewone array als interne datastructuur.

Zorg ervoor dat onderstaande clientcode bijhorende output geeft.
Visual Basic 2012 Broncode - Codevoorbeeld 533
Class Exercise2Task
    Public Shared Sub Main()
        Dim arrayList1 As ArrayList = New ArrayList
        '
        Console.WriteLine(arrayList1.Capacity)   ' 16
        Console.WriteLine(arrayList1.Count)      ' 0
        '
        arrayList1 = New ArrayList(2)
        Console.WriteLine(arrayList1.Capacity)   ' 2
        '
        arrayList1.Add(1)
        arrayList1.Add("2"c)
        Console.WriteLine(arrayList1.Capacity)   ' 2
        arrayList1.Add("three")
        Console.WriteLine(arrayList1.Count)      ' 3
        Console.WriteLine(arrayList1.Capacity)   ' 4
        '
        PrintArrayList(arrayList1)               ' "1 - 2 - three - "
        '
        arrayList1.RemoveAt(1)
        PrintArrayList(arrayList1)               ' "1 - three - "
        Console.WriteLine(arrayList1.Count)      ' 2
        Console.WriteLine(arrayList1.Capacity)   ' 4
        '
        arrayList1.TrimToSize()
        Console.WriteLine(arrayList1.Count)      ' 2
        Console.WriteLine(arrayList1.Capacity)   ' 2
        PrintArrayList(arrayList1)               ' "1 - three - "
        '
        arrayList1.Clear()
        Console.WriteLine(arrayList1.Capacity)   ' 2
        Console.WriteLine(arrayList1.Count)      ' 0
        PrintArrayList(arrayList1)               ' ""
        '
        Console.ReadLine()
    End Sub
    Public Shared Sub PrintArrayList(ByVal arrayList As ArrayList)
        For index As Integer = 0 To arrayList.Count - 1
            If arrayList.Item(index) IsNot Nothing Then
                Console.Write(arrayList.Item(index).ToString() & " - ")
            End If
        Next
        Console.WriteLine()
    End Sub
End Class
Console Application Output
16
0
2
2
3
4
1 - 2 - three -
1 - three -
2
4
2
2
1 - three -
2
0
Oplossing :
Visual Basic 2012 Broncode - Codevoorbeeld 534
Class ArrayList
    Private _Capacity As Integer
    Private _Items As Object()
    Private _ItemCount As Integer
    Public Sub New(Optional ByVal capacity As Integer = 16)
        _Capacity = capacity
        Clear()
    End Sub
    Public ReadOnly Property Capacity() As Integer
        Get
            Capacity = _Capacity
        End Get
    End Property
    Public ReadOnly Property Count() As Integer
        Get
            Count = _ItemCount
        End Get
    End Property
    Public Sub Add(ByVal value As Object)
        If Count >= Capacity Then
            _Capacity = Capacity * 2
            ReDim Preserve _Items(Capacity - 1)
        End If
        _Items(Count) = value
        _ItemCount += 1
    End Sub
    Default Public ReadOnly Property Item(ByVal index As Integer) As Object
        Get
            Item = _Items(index)
        End Get
    End Property
    Public Sub RemoveAt(ByVal index As Integer)
        For shiftIndex As Integer = index To Count - 1
            _Items(index) = _Items(index + 1)
        Next
        _Items(Count - 1) = Nothing
        _ItemCount -= 1
    End Sub
    Public Sub TrimToSize()
        _Capacity = Count
        ReDim Preserve _Items(Capacity - 1)
    End Sub
    Public Sub Clear()
        ReDim _Items(Capacity)
        _ItemCount = 0
    End Sub
End Class

22.7.3. Typesafe System.Collections.Generic.List(Of T)

Indien het type van de elementen van de ArrayList vastligt, kan men beter een typesafe variant van ArrayList gebruiken, namelijk List(Of T).

Voor meer details over dergelijke generieke collectietypes en typesafe collecties, zie de desbetreffende topics.

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.