Generics utökar kraften och flexibiliteten hos VB.NET inom många områden, men du får en större prestandafördel och fler programmeringsalternativ i det generiska Lista objekt [Lista (av T)] än med någon annan.
Att använda Lista (av T), måste du förstå hur du implementerar de många metoder som .NET Framework tillhandahåller. Nedan följer tre exempel För varje, Hitta alla, och Sortera, som visar hur den generiska Lista klass fungerar.
Det allra första steget är att skapa en generisk Lista. Du kan få informationen på många sätt, men det enklaste är att bara Lägg till den. Koden nedan visar hur jag klassificerar min öl- och vinsamling!
Det måste först finnas ett objekt som kommer att representera en flaska från samlingen. I en Windows Forms-applikation måste Form-klassen först vara i en fil eller så kan Visual Studio-designern inte fungera korrekt, så sätt detta i slutet:
Offentlig klassflaska Offentligt märke som sträng Offentligt namn som sträng Offentlig kategori som sträng Offentlig storlek som decimalt Public Sub Nytt (_ 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
Att bygga samlingen, Lägg till föremålen. Det här är vad som finns i Formbelastning händelse:
Dim Cabinet As List (Of Bottle) = _ "New List (Of Bottle) Cabinet. Lägg till (New Bottle (_" Castle Creek ", _" Uintah Blanc ", _" Wine ", 750)) Cabinet.Add (New Bottle) (_ "Zion Canyon Brewing Company", _ "Springdale Amber Ale", _ "Beer", 355)) Skåp. Lägg till (New Bottle (_ "Spanish Valley Vineyards", _ "Syrah", _ "Wine", 750) ) Skåp. Lägg till (New Bottle (_ "Wasatch Beers", _ "Polygamy Porter", _ "Beer", 355)) Cabinet. Lägg till (New Bottle (_ "Squatters Beer", _ "Provo Girl Pilsner", _ " Öl ", 355))
All ovanstående kod är standardkod i VB.NET 1.0. Observera dock att du definierar din egen Flaska objekt, du får fördelarna med flera typer i samma samling (i detta fall båda Sträng och Decimal) och effektiv, typ säker "sen bindning."
Rolan börjar när vi använder metoderna. Till att börja med, låt oss genomföra det bekanta För varje metod. Microsoft-dokumentationen innehåller definitionen av användarsyntax:
Dim-instans som lista Dim-åtgärd som handling (av T) -instans. För alla (åtgärd)
Microsoft definierar vidare verkan som "delegera till en metod som utför en åtgärd på objektet som skickas till det. Elementen i den aktuella listan (T) överförs individuellt till åtgärdsdelegaten."
Dricks: Läs mer om delegater i Använda delegater i Visual Basic .NET för Runtime Flexibilitet.
Det första du behöver koda är metoden som kommer att delegeras. Misförståelse av den här nyckelpunkten är källan till mest av förvirringen av VB.NET-studenter. Denna funktion, eller subrutin, är där all den anpassade kodningen för objekten "Av" görs.
När du utförs korrekt är du i grunden klar. Det är verkligen enkelt i det här första exemplet. En hel instans av Flaska passeras och subrutinen väljer allt som behövs ur det. Kodning av För varje själv är också enkelt. Fyll bara i adress för delegaten med hjälp av AddressOf metod.
Sub displayBottle (ByVal b As Bottle) ResultatList.Items.Tillfoga (_ b.Brand & "-" & _ b.Name & "-" & _ b.Category & "-" & _ b.Size) Slut Sub Private Sub ForEachButton_Click (... ResultList.Items.Clear () ResultatList.Items.Add ("För varje exempel") ResultatList.Items.Add ("--------------------- - ") Cabinet.ForEach (AddressOf displayBottle) End Sub
Hitta alla är lite mer komplicerat. Microsoft-dokumentationen för Hitta alla ser ut så här:
Dim instans som lista Dim match som predikat (av T) Dim returnValue As List (Of T) returnValue = instans.FindAll (match)
Denna syntax innehåller ett nytt element, Predikat (av T). Enligt Microsoft kommer detta att representera metoden "som definierar en uppsättning kriterier och avgör om det angivna objektet uppfyller dessa kriterier." Med andra ord kan du skapa valfri kod som hittar något i listan. Jag kodade min Predikat (av T) att hitta något i "öl" Kategori.
Istället för att ringa delegatkoden för varje objekt i listan, Hitta alla returnerar en hel Lista (T) som bara innehåller matchningarna som är resultatet av din Predikat (av T). Det är upp till din kod att båda definiera denna sekund Lista (T) och gör något med det. Min kod lägger bara artiklarna till a listruta.
Privat sub FindAllButton_Click (ByVal avsändare som system.Objekt, ByVal e As System.EventArgs) hanterar FindAllButton.Click ResultList.Items.Clear () ResultatList.Items.Add ("FindAll Exempel") ResultList.Items.Add ("--- -------------------- ") Dim sublist As List (Of Bottle) sublist = Cabinet.FindAll (AddressOf findBeer) För varje r som flaska i sublist ResultatList.Items. Lägg till (_ r.Brand & "-" & _ r.Name & "-" & _ r.Kategori & "-" & _ r.Size) Nästa slut Underfunktion findBeer (ByVal b som flaska) _ Som boolesk om ( b.Category = "Beer") Returnera sedan True Else Return False End If End-funktion
Den sista metoden som denna artikel undersöker är Sortera. Återigen använder Microsoft någon terminologi som du kanske inte känner till. Det finns faktiskt fyra olika överbelastningar av Sortera metod:
Detta låter dig använda sorteringsmetoder definierade i .NET Framework för listan, koda dina egna, använda en systemdefinierad jämförelse för typen eller sortera en del av samlingen med hjälp av en startposition och räknarparameter.
I det här exemplet använder jag den tredje överbelastningen eftersom jag använder följande syntax för att utföra sorteringen.
x.Name.x.Name.CompareTo (y.Name) (y.Name)
Jag har kodat en annan delegat till min egen jämförare. Eftersom jag vill sortera efter min namn, Jag drar precis det värdet från varje instans av Flaska objekt som passeras och använd Sort (Jämförelse<(Of )>)). De Sortera metoden ordnar om originalen Lista (T). Det är vad som behandlas efter att metoden har körts.
Privat sub SortButton_Click (ByVal avsändare som system.Objekt, ByVal e As System.EventArgs) Hanterar SortButton.Click ResultList.Items.Clear () ResultatList.Items.Tillfoga ("Sortera exempel") ResultList.Items.Add ("--- -------------------- ") Skåp.Sort (AddressOf sortCabinet) för varje r som flaska i skåp Resultatlista. Objekt.Tillfoga (_ r.namn &" - " & _ r.Brand & "-" & _ r.Category & "-" & _ r.Size) Nästa slut Sub Privat delad funktion sortCabinet (_ ByVal x Som flaska, ByVal y som flaska) Som heltal Retur x.Name. CompareTo (y.Name) slutfunktion
Dessa metoder valdes för att visa de viktigaste sätten som rammetoderna på Lista (T) är faktiskt kodade. Det finns dock en hel mängd andra metoder. Det är det som gör Lista (T) så användbart!