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

23.9. System.Collections.Generic.List(Of T)

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.

23.9.1. System.Collections.Generic.List(Of T)

Een generieke versie van de System.Collections.ArrayList klasse, is System.Collections.Generic.List(Of T).  List(Of T) implementeert net als ArrayList de IList interface, maar implementeert dan ook nog de IList(Of T) interface.

In tegenstelling tot ArrayList, die werkt met elementen van het type Object, en dus niet strongly typed is, zal List(Of T) met elementen werken van het actueel generisch parametertype.

Zo zal reeds at compiletime verhinderd worden dat we andere elementen dan deze van type Person (of afgeleid) toevoegen aan de lijst ( List(Of Person)) (1).  Dit is niet het geval bij een gewone ArrayList (3).
Een call naar de Item method van List(Of Person) object, zoals list1.Item(1) op regel (2), is meteen een expressie van type Person.
De call naar Item van een ArrayList object, zoals arrayList1.Item(1) op regel (4), is echter een Object expressie.  Deze expressie moeten we vervolgens nog casten om de specifieke members van het type Person te kunnen benaderen :
Visual Basic 2012 Broncode - Codevoorbeeld 602
Option Strict On

Imports System.Collections.Generic

Namespace ListOfTExample
    Public Class Person
        Public Property Name As String
        Public Overrides Function Equals(ByVal obj As Object) As Boolean
            If obj IsNot Nothing AndAlso TypeOf obj Is Person Then
                Equals = Name.Equals(DirectCast(obj, Person).Name)
            End If
        End Function
        Public Overrides Function GetHashCode() As Integer
            GetHashCode = Name.GetHashCode()
        End Function
        Public Overrides Function ToString() As String
            ToString = Name
        End Function
    End Class
    Public Class Client1
        Public Shared Sub Main()
            Dim list1 As New List(Of Person)
            '
            list1.Add(New Person With {.Name = "John"})
            list1.Add(New Person With {.Name = "Jane"})
            'list1.Add(New Object)                                         ' (1)
            '
            Console.WriteLine(list1.Item(1).Name)                          ' (2)
            '
            Dim arrayList1 As New ArrayList
            '
            arrayList1.Add(New Person With {.Name = "John"})
            arrayList1.Add(New Person With {.Name = "Jane"})
            arrayList1.Add(New Object)                                     ' (3)
            '
            Console.WriteLine(DirectCast(arrayList1.Item(1), Person).Name) ' (4)
            '
            Console.ReadLine()
        End Sub
    End Class
End Namespace
Console Application Output
Jane
Jane

23.9.2. List(Of T) Methods met Delegate Argumenten

Type List(Of T) beschikt over enkele zeer nuttige methods die werken op basis van een delegate argument.

Voor de Exists, Find* en TrueForAll method moet dit een predicaat ( Predicate(Of T)) zijn die aangeeft aan welke voorwaarde moet voldaan zijn.
Method ForEach verwacht een Action(Of T) die definieert welke actie ondernomen wordt voor elk element van de lijst.
Method ConvertAll werkt op basis van een Converter(Of T, TOutput) die aangeeft hoe de elementen van de collectie (van type T) worden geconverteerd naar TOutput vorm :
Visual Basic 2012 Broncode - Codevoorbeeld 603
Namespace ListOfTExample
    Public Class Client2
        Public Shared Sub Main()
            Dim list1 As New List(Of Person)
            list1.Add(New Person With {.Name = "John"})
            list1.Add(New Person With {.Name = "Jane"})
            '
            Dim match1 As Predicate(Of Person) = _
                                        Function(item) item.Name.StartsWith("J")
            Console.WriteLine(list1.Exists(match1))          ' True
            Console.WriteLine(list1.Find(match1).ToString()) ' John
            Console.WriteLine(list1.FindIndex(match1))       ' 0
            Console.WriteLine(list1.FindLastIndex(match1))   ' 1
            Console.WriteLine(list1.TrueForAll(match1))      ' True
            '
            Dim action1 As Action(Of Person) = AddressOf ChangeNameToUpperCase
            list1.ForEach(action1)
            Print(list1)                                     ' JOHN JANE
            '
            Dim converter1 As Converter(Of Person, Char) = _
                                                     Function(item) item.Name(1)
            Dim charList1 As List(Of Char) = list1.ConvertAll(converter1)
            Print(charList1)                                 ' O A
            '
            Console.ReadLine()
        End Sub
        Private Shared Sub ChangeNameToUpperCase(ByVal value As Person)
            value.Name = value.Name.ToUpper()
        End Sub
        Public Shared Sub Print(ByVal collection As ICollection)
            For Each element As Object In collection
                Console.Write(element.ToString() & " ")
            Next
            Console.WriteLine()
        End Sub
    End Class
End Namespace
Console Application Output
True
John
0
1
True
JOHN JANE
O A
De methods gedemonstreerd in bovenstaand voorbeeld zijn geen extension methods ("query methods") die voorzien zijn voor "LINQ to Object", maar zijn in het type List(Of T) zelf gedefinieerd, en bijgevolg altijd bruikbaar.

Voor meer details over LINQ to Object, delegates en de in bovenstaand voorbeeld gebruikte lambda functies kan je terecht in 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.