De handige generieke lijst in VB.NET

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

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

De allereerste stap is het maken van een generieke Lijst. U kunt de gegevens op veel manieren verkrijgen, maar het eenvoudigst is om het gewoon te doen Toevoegen het. De onderstaande code laat zien hoe mijn bier- en wijncollectie te classificeren!

Startcode

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

 Public Class Bottle Public Brand As String Public Name As String Public Category As String Public Grootte As Decimal Public Sub Nieuw (_ ByVal m_Brand As String, _ ByVal m_Name As String, _ ByVal m_Category As String, _ ByVal m_Size As Decimal) Brand = m_Brand Name = m_Name Category = m_Category Size = m_Size End Sub End Class 

Om de verzameling te bouwen, Toevoegen de artikelen. Dit zit er in Formulier laden evenement:

 Dim Cabinet As List (van fles) = _ "Nieuwe lijst (van fles) Cabinet.Add (nieuwe fles (_" Castle Creek ", _" Uintah Blanc ", _" Wine ", 750)) Cabinet.Add (nieuwe fles (_ "Zion Canyon Brewing Company", _ "Springdale Amber Ale", _ "Beer", 355)) Cabinet.Add (nieuwe fles (_ "Spanish Valley Vineyards", _ "Syrah", _ "Wine", 750) ) Cabinet.Add (nieuwe fles (_ "Wasatch Beers", _ "Polygamy Porter", _ "Beer", 355)) Cabinet.Add (nieuwe fles (_ "Squatters Beer", _ "Provo Girl Pilsner", _ " Bier ', 355)) 

Alle bovenstaande code is standaardcode in VB.NET 1.0. Merk echter op dat u deze zelf definieert Fles object krijgt u de voordelen van meerdere typen in dezelfde verzameling (in dit geval beide Draad en Decimale) en efficiënt, type 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 de gebruikssyntaxis:

Dim instantie als lijst Dim actie als actie (van T) instantie. ForEach (actie)

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

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

Het eerste dat u moet coderen, is de methode die wordt gedelegeerd. Misverstand over dit kernpunt is de bron van meest van de verwarring bij VB.NET-studenten. Met deze functie of subroutine wordt alle aangepaste codering voor objecten van het type "Of" uitgevoerd.

Als je het correct uitvoert, 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 nodig is. Codering van de ForEach zelf is ook eenvoudig. Vul gewoon het adres van de gemachtigde in met behulp van de AddressOf methode.

Sub displayBottle (ByVal b als fles) ResultList.Items.Add (_ b.Brand & "-" & _ b.Name & "-" & _ b.Category & "-" & _ b.Size) Einde Sub Private Sub ForEachButton_Click (... ResultList.Items.Clear () ResultList.Items.Add ("Voor elk voorbeeld") ResultList.Items.Add ("--------------------- - ") Cabinet.ForEach (AddressOf displayBottle) End Sub

Vind alle voorbeelden

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

Dim instantie als lijst Dim match als predicaat (van T) Dim returnValue als lijst (van T) returnValue = instance.FindAll (match)

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

In plaats van de gedelegeerde code aan te roepen voor elk item in de lijst, Vind alle geeft een geheel terug List (T) met alleen de overeenkomsten die het gevolg zijn van uw Predicaat (van T). Het is aan jouw code om beide seconden te definiëren List (T) en er iets mee doen. Mijn code voegt alleen de items toe aan een Keuzelijst.

Private Sub FindAllButton_Click (ByVal-afzender als System.Object, ByVal e As System.EventArgs) Handles FindAllButton.Click ResultList.Items.Clear () ResultList.Items.Add ("FindAll Example") ResultList.Items.Add ("--- -------------------- ") Dim sublijst als lijst (van fles) sublijst = Cabinet.FindAll (AddressOf findBeer) Voor elke r als fles in sublijst ResultList.Items. Toevoegen (_ r.Brand & "-" & _ r.Name & "-" & _ r.Category & "-" & _ r.Size) Volgende Einde Subfunctie findBeer (ByVal b als fles) _ Als Boolean If ( b.Category = "Beer") Retourneer dan True Else Retourneer False End If End-functie

Sorteer voorbeeld

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 in het .NET Framework voor de lijst zijn gedefinieerd, uw eigen code coderen, een door het systeem gedefinieerde vergelijking voor het type gebruiken of een deel van de verzameling sorteren met behulp van een startpositie en telparameter.

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

x.Name.x.Name.CompareTo (y.Name) (y.Name)

Ik heb een andere afgevaardigde naar mijn eigen vergelijker gecodeerd. Omdat ik op mijn wil sorteren Naam, Ik haal precies die waarde uit elke instantie van de Fles object dat wordt doorgegeven en gebruik de Sort (Vergelijking<(Of )>)). De Soort methode herschikt eigenlijk het origineel List (T). Dat wordt verwerkt nadat de methode is uitgevoerd.

Private Sub SortButton_Click (ByVal-afzender als System.Object, ByVal e As System.EventArgs) Handvatten SortButton.Click ResultList.Items.Clear () ResultList.Items.Add ("Sort Example") ResultList.Items.Add ("--- -------------------- ") Cabinet.Sort (AddressOf sortCabinet) Voor elke r Als fles in kast ResultList.Items.Add (_ r.Name &" - ​​" & _ r.Brand & "-" & _ r.Category & "-" & _ r.Size) Volgende einde Sub Privé Gedeelde functie sortCabinet (_ ByVal x als fles, ByVal y als fles) als geheel getal Retour x.Name. CompareTo (y.Name) Eindfunctie

Deze methoden zijn geselecteerd om de belangrijkste manieren aan te tonen waarop de Framework-methoden zich bevinden List (T) zijn eigenlijk gecodeerd. Er is echter een hele reeks andere methoden. Dat is wat maakt List (T) zo handig!