|
Dit artikel is gepubliceerd op zondag 31 juli 2011 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 2010 Broncode Option Strict OnImports System.Collections.Generic Namespace ListOfTExample Public Class Person Private _Name As String Public Property Name() As String Get Name = _Name End Get Set( ByVal value As String) _Name = value End Set End Property 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"}) Console.WriteLine(list1.Item(1).Name) Dim arrayList1 As New ArrayList arrayList1.Add( New Person With {.Name = "John"}) arrayList1.Add( New Person With {.Name = "Jane"}) arrayList1.Add( New Object) Console.WriteLine( DirectCast(arrayList1.Item(1), Person).Name) Console.ReadLine() End Sub End ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output Jane
Jane boven
23.9.2. List(Of T) Methods met Delegate ArgumentenList(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. ForEach verwacht een Action(Of T) die definieert welke actie ondernomen wordt voor elk element van de lijst. 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 2010 Broncode 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)) Console.WriteLine(list1.Find(match1).ToString()) Console.WriteLine(list1.FindIndex(match1)) Console.WriteLine(list1.FindLastIndex(match1)) Console.WriteLine(list1.TrueForAll(match1)) Dim action1 As Action( Of Person) = AddressOf ChangeNameToUpperCase list1.ForEach(action1) Print(list1) Dim converter1 As Converter( Of Person, Char) = _ Function(item) item.Name(1) Dim charList1 As List( Of Char) = list1.ConvertAll(converter1) Print(charList1) 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 ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|