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.9. Collection Initializers - From

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.

Indien men in Visual Basic 2008 een nieuw collectie object wil populeren met enkele elementwaardes, gaat men vaak per toe te voegen elementwaarde de Add method op deze collectie aanroepen :
Visual Basic 2012 Broncode - Codevoorbeeld 538
Namespace CollectionInitializers
    Class VisualBasic2008Example
        Public Shared Sub Main()
            Dim someList As New List(Of Integer)
            someList.Add(1)
            someList.Add(2)
            someList.Add(3)
            '
            Dim someDictionary As New Dictionary(Of Integer, Double)
            someDictionary.Add(1, 1.11)
            someDictionary.Add(2, 2.22)
            someDictionary.Add(3, 3.33)
        End Sub
    End Class
End Namespace
Om dit te vereenvoudigen kan men vanaf Visual Basic 10.0 (2010) de vernieuwde collection initializers gebruiken.
Hierin is een het mogelijk een From clausule te gebruiken waarin men tussen braces (accolades) de toe te voegen waardes specifiëert :
Visual Basic 2012 Broncode - Codevoorbeeld 539
Namespace CollectionInitializers
    Class VisualBasic2010Example
        Public Shared Sub Main()
            Dim someList As New List(Of Integer) From {1, 2, 3}
            '
            Dim someDictionary As New Dictionary(Of Integer, Double) _
                               From {{1, 1.11}, {2, 2.22}, {3, 3.33}}
        End Sub
    End Class
End Namespace
De in de From clausule vermelde elementen worden hier één voor één toegevoegd (via de Add implementatie) aan de collectie.

Deze nieuwe collection initializers zijn te gebruiken bij alle collecties ( op zijn minst System.Collections.IEnumerable implementaties) die beschikken over een toegankelijke Add method met de juiste parameters.

Stel dat we beschikken over ons eigen collectietype Persons (subtype van CollectionBase en bijgevolg IEnumerable) met een Add method met Person parameter :
Visual Basic 2012 Broncode - Codevoorbeeld 540
Namespace CollectionInitializers
    Class Persons : Inherits CollectionBase
        Public Function Add(ByVal value As Person) As Integer
            Return List.Add(value)
        End Function
    End Class
    Class Person
        Public Property Id As Integer
        Public Property Name As String
        Public Property Email As String
    End Class
End Namespace
Dan kan men in een collection initializer verschillende Person expressies formuleren die aangeven welke de initiële persoonselementen zijn :
Visual Basic 2012 Broncode - Codevoorbeeld 541
Namespace CollectionInitializers
    Class Example1
        Public Shared Sub Main()
            Dim person1 As New Person With {.Id = 1, .Name = "John"}
            '
            Dim collection1 As New Persons _
                       From {person1, New Person With {.Id = 2, .Name = "Jane"}}
            '
            Print(collection1)
            '
            Console.ReadLine()
        End Sub
        Public Shared Sub Print(ByVal collection As Persons)
            For Each element As Person In collection
                Console.Write(element.Name & "(" & element.Id & ")")
                If element.Email <> "" Then
                    Console.WriteLine("(" & element.Email & ")")
                Else
                    Console.WriteLine()
                End If
            Next
        End Sub
    End Class
End Namespace
Console Application Output
John(1)
Jane(2)
Beide initialisatiewaardes in bovenstaand voorbeeld, person1 en New Person With {.Id = 2, .Name = "Jane"}, zijn Person expressie, wat toegelaten is gezien de Persons klasse beschikt over een Add method met Person argument.
Het spreekt voor zich dat deze Add method toegankelijk moet zijn op de positie waar de collection initializer formuleert.  Hier is dit het geval, de Add method is Public.

Stel dat ons collectietype Persons ook beschikt over een Add method die zelf, op basis van een id en name parameterwaarde, een Person object zou creëren om toe te voegen aan de collectie :
Visual Basic 2012 Broncode - Codevoorbeeld 542
Namespace CollectionInitializers
    Partial Class Persons
        Public Function Add(ByVal id As Integer,
                            ByVal name As String) As Integer
            Return List.Add(New Person With {.Id = id, .Name = name})
        End Function
    End Class
End Namespace
Dan kunnen we in een "geneste" collection initializer de parameterwaardes voor id en name tussen accolades als initialisatiewaardes opsommen :
Visual Basic 2012 Broncode - Codevoorbeeld 543
Namespace CollectionInitializers
    Class Example2
        Public Shared Sub Main()
            Dim collection2 As New Persons From {{1, "John"}, {2, "Jane"}}
            '
            Example1.Print(collection2)
            '
            Console.ReadLine()
        End Sub
    End Class
End Namespace
Console Application Output
John(1)
Jane(2)
In dergelijke geneste collection initializer worden de verschillende initialisatiewaardes ({1, "John"} en {2, "Jane"}) dus zelf tussen accolades geplaatst.  Ze bevatten de waardes die aan de parameters van een - via de overload resolution gepaste - gevonden Add method worden toegekend.

Indien een collectietype niet over een geschikte Add method beschikt voor het ontvangen van de in de collection initializer gespecifiëerde waardes, en men deze Add methond niet kan of wil toevoegen aan het collectietype.  Dan kan men nog altijd een extension Add method schrijven om dit werk te verrichten.

Als we bijvoorbeeld meteen in de collection initializer zowel de Id, Name als Email van een nieuw collectie-element wil opgeven (1), dan is het tot nu toe zo dat de Persons klasse niet over een gepaste Add method beschikt voor het ontvangen van deze drie parameterwaarde.
De extension method PersonsExtension.Add (2) zou hier een oplossing kunnen bieden :
Visual Basic 2012 Broncode - Codevoorbeeld 544
Namespace CollectionInitializers
    Class Example3
        Public Shared Sub Main()
            Dim collection3 As New Persons _
                                    From {{1, "John", "john@example.com"},
                                          {2, "Jane", "jane@example.com"}} ' (1)
            '
            Example1.Print(collection3)
            '
            Console.ReadLine()
        End Sub
    End Class
    Module PersonsExtension
        <Runtime.CompilerServices.Extension()>
        Public Sub Add(ByVal collection As Persons, ByVal id As Integer,
                                                    ByVal name As String,
                                                    ByVal email As String) ' (2)
            collection.Add(New Person With {.Id = id,
                                            .Name = name,
                                            .Email = email})
        End Sub
    End Module
End Namespace
Console Application Output
John(1)(john@example.com)
Jane(2)(jane@example.com)

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