De bruikbare generieke lijst in VB.NET

Generics vergroten de kracht en flexibiliteit van VB.NET op veel gebieden, maar u krijgt een groter prestatievoordeel en meer programmeeropties in de generieke Lijst voorwerp [Lijst (van T)] dan bij andere.

Gebruiken Lijst (van T), moet u begrijpen hoe u de vele methoden die .NET Framework biedt, kunt implementeren. Hieronder volgen drie voorbeelden ForEach, Vind alle, en Soort, dat laat zien hoe de generieke Lijst klasse werkt.

De allereerste stap is het maken van een generiek Lijst. U kunt de gegevens op veel manieren verkrijgen, maar de eenvoudigste is om gewoon Toevoegen het. De onderstaande code laat zien hoe ik mijn bier- en wijncollectie classificeer!

Startcode

Er moet eerst een object zijn dat een fles uit de collectie vertegenwoordigt. In een Windows Forms-toepassing moet de klasse Form zich eerst in een bestand bevinden, anders werkt de Visual Studio-ontwerper niet correct, dus zet dit aan het einde:

Fles van openbare klasse. Openbaar merk als tekenreeks. Openbare naam als tekenreeks. Openbare categorie als tekenreeks. Openbare grootte als decimaal. Public Sub New (_. ByVal m_Brand As String, _. ByVal m_Name As String, _. ByVal m_Category As String, _. ByVal m_Size als decimaal) Merk = m_Brand. Name = m_Name. Category = m_Category. Grootte = m_Size. Einde Sub. Einde klasse
instagram viewer

Om de collectie op te bouwen, Toevoegen de artikelen. Dit is wat er in de Vorm laden evenement:

Dim kabinet als lijst (van fles) = _. "Nieuwe lijst (fles) Kabinet. Voeg (nieuwe fles (_. "Castle Creek", _. "Uintah Blanc", _. "Wine", 750)) Kabinet. Voeg (nieuwe fles (_. "Zion Canyon Brewing Company", _. "Springdale Amber Ale", _. "Beer", 355)) Kabinet. Voeg (nieuwe fles (_. "Spanish Valley Vineyards", _. "Syrah", _. "Wine", 750)) Kabinet. Voeg (nieuwe fles (_. "Wasatch Beers", _. "Polygamie Porter", _. "Beer", 355)) Kabinet. Voeg (nieuwe fles (_. "Squatters Beer", _. "Provo Girl Pilsner", _. "Beer", 355))

Alle bovenstaande code is standaardcode in VB.NET 1.0. Merk echter op dat door uw eigen te definiëren Fles object krijgt u de voordelen van meerdere typen in dezelfde collectie (in dit geval beide Draad en Decimale) en efficiënt, typ veilige "late binding".

Voor elk voorbeeld

Het plezier begint wanneer we de methoden gebruiken. Laten we om te beginnen het bekende implementeren ForEach methode. De Microsoft-documentatie bevat deze definitie van gebruikssyntaxis:

Diminstantie als lijst Dimactie als actie (van T) -instantie. ForEach (actie)

Microsoft definieert verder actie als "delegeren naar een methode die een actie uitvoert op het object dat eraan is doorgegeven. De elementen van de huidige lijst (T) worden individueel doorgegeven aan de gedelegeerde van actie (T). "

Tip: Lees voor meer informatie over afgevaardigden Afgevaardigden gebruiken in Visual Basic .NET voor Runtime-flexibiliteit.

Het eerste dat u moet coderen, is de methode die wordt gedelegeerd. Het verkeerd begrijpen van dit ene sleutelpunt is de bron van meest van de verwarring van VB.NET-studenten. Deze functie, of subroutine, is waar alle aangepaste codering voor de "Of" type objecten wordt gedaan.

Als het correct wordt uitgevoerd, ben je in wezen klaar. In dit eerste voorbeeld is het heel eenvoudig. Een heel exemplaar van de Fles is doorgegeven en de subroutine selecteert alles wat er nodig is. Codering van de ForEach zelf is ook eenvoudig. Vul gewoon het adres van de gemachtigde in met de Adres van methode.

Subweergave Fles (ByVal b As Bottle) ResultList. Artikelen. Voeg (_ b. Merk & "-" & _ b. Naam & "-" & _ b. Categorie & "-" & _ b. Grootte) End Sub Private Sub ForEachButton_Click (... ResultList. Artikelen. Wis () ResultList. Artikelen. Voeg ("Voor elk voorbeeld") ResultList toe. Artikelen. Kabinet toevoegen (""). ForEach (AddressOf displayBottle) End Sub

FindAll Voorbeeld

Vind alle is een beetje ingewikkelder. De Microsoft-documentatie voor Vind alle het lijkt hierop:

Dim instantie As List Dim match As Predicate (Of T) Dim returnValue As List (Of T) returnValue = instance. FindAll (overeenkomst)

Deze syntaxis bevat een nieuw element, Predikaat (van T). Volgens Microsoft zal dit de methode vertegenwoordigen "die een reeks criteria definieert en bepaalt of de opgegeven object voldoet aan deze criteria. "Met andere woorden, u kunt elke code maken die iets in de lijst. Ik heb mijn gecodeerd Predikaat (van T) om iets te vinden in het "Bier" Categorie.

In plaats van de deelnemerscode voor elk item in de lijst aan te roepen, Vind alle geeft een geheel terug Lijst (T) met alleen de overeenkomsten die het resultaat zijn van uw Predikaat (van T). Het is aan uw code om deze tweede te definiëren Lijst (T) en er iets mee doen. Mijn code voegt de items toe aan een Keuzelijst.

Private Sub FindAllButton_Click (ByVal-afzender als systeem. Object, ByVal e As System. EventArgs) behandelt FindAllButton. Klik op ResultList. Artikelen. Wis () ResultList. Artikelen. Voeg ("FindAll-voorbeeld") ResultList toe. Artikelen. Voeg ("") dim sublijst toe als lijst (van fles) sublijst = kabinet. FindAll (AddressOf findBeer) voor elke r als fles in sublijst ResultList. Artikelen. Voeg (_ r. Merk & "-" & _ r. Naam & "-" & _ r. Categorie & "-" & _ r. Grootte) Volgende einde Subfunctie findBeer (ByVal b As Bottle) _ As Boolean If (b. Category = "Beer") Return True Else Return False End If End Function

Voorbeeld sorteren

De laatste methode die dit artikel onderzoekt is Soort. Nogmaals, Microsoft gebruikt een terminologie die u misschien niet kent. Er zijn eigenlijk vier verschillende overbelastingen van de Soort methode:

  • Soort()
  • Sorteren (IComparer (T))
  • Sorteren (vergelijking (T))
  • Sorteren (Int32, Int32, IComparer (T))

Hiermee kunt u sorteermethoden gebruiken die zijn gedefinieerd in .NET Framework voor de lijst, uw eigen code coderen en een systeem gebruiken gedefinieerde vergelijking voor het type of sorteer een deel van de collectie met een startpositie en tel parameter.

In dit voorbeeld, aangezien ik de volgende syntaxis gebruik om de sortering daadwerkelijk uit te voeren, gebruik ik de derde overbelasting.

X. Naam.x. Naam. CompareTo (y. Naam) (y. Naam)

Ik heb een andere afgevaardigde gecodeerd voor mijn eigen vergelijker. Omdat ik op mijn wil sorteren Naam, Ik haal alleen die waarde uit elke instantie van de Fles object dat is gepasseerd en gebruik de Sorteren (vergelijking )>)). De Soort methode herschikt eigenlijk het origineel Lijst (T). Dat is wat wordt verwerkt nadat de methode is uitgevoerd.

Private Sub SortButton_Click (ByVal-afzender als systeem. Object, ByVal e As System. EventArgs) verwerkt SortButton. Klik op ResultList. Artikelen. Wis () ResultList. Artikelen. Voeg ("Sorteervoorbeeld") ResultList toe. Artikelen. Kabinet toevoegen (""). Sorteer (AddressOf sortCabinet) voor elke r als fles in kast ResultList. Artikelen. Voeg (_ r. Naam & "-" & _ r. Merk & "-" & _ r. Categorie & "-" & _ r. Grootte) Volgende Einde Sub Privé Gedeelde functie sortCabinet (_ ByVal x As Bottle, ByVal y As Bottle) As Integer Return x. Naam. CompareTo (y. Naam) Functie beëindigen

Deze methoden zijn geselecteerd om de belangrijkste manieren te demonstreren waarop de Framework-methoden Lijst (T) zijn eigenlijk gecodeerd. Er zijn echter nog een hele reeks andere methoden. Dat is wat maakt Lijst (T) zo handig!

instagram story viewer