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 ClassEnd NamespaceDownload Visual Basic 2012 Broncode Download Visual C# Sourcecode
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 ClassEnd NamespaceDownload Visual Basic 2012 Broncode Download Visual C# Sourcecode
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 ClassEnd NamespaceDownload Visual Basic 2012 Broncode Download Visual C# Sourcecode
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 ClassEnd NamespaceDownload Visual Basic 2012 Broncode Download Visual C# Sourcecode
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 ClassEnd NamespaceDownload Visual Basic 2012 Broncode Download Visual C# Sourcecode
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 ClassEnd NamespaceDownload Visual Basic 2012 Broncode Download Visual C# Sourcecode
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"}} 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) collection.Add( New Person With {.Id = id, .Name = name, .Email = email}) End Sub End ModuleEnd NamespaceDownload Visual Basic 2012 Broncode Download Visual C# Sourcecode
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.
|