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 vinkollektion!
Startkod
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 varumärke som sträng. Offentligt namn som sträng. Offentlig kategori som sträng. Offentlig storlek som decimal. Public Sub New (_. ByVal m_Brand As String, _. ByVal m_Name As String, _. ByVal m_Category As String, _. ByVal m_Size As Decimal) Märke = m_Brand. Namn = m_Name. Kategori = m_Kategori. Storlek = m_Size. Avsluta under. Slutklass
För att bygga samlingen, Lägg till föremålen. Det här är vad som finns i Formbelastning händelse:
Dim skåp som lista (av flaska) = _. "Ny lista (av flaskor) Skåp. Lägg till (Ny flaska (_. "Castle Creek", _. "Uintah Blanc", _. "Vin", 750)) Skåp. Lägg till (Ny flaska (_. "Zion Canyon Brewing Company", _. "Springdale Amber Ale", _. "Öl", 355)) Skåp. Lägg till (Ny flaska (_. "Spanish Valley Vineyards", _. "Syrah", _. "Vin", 750)) Skåp. Lägg till (Ny flaska (_. "Wasatch Beers", _. "Polygamy Porter", _. "Öl", 355)) Skåp. Lägg till (Ny flaska (_. "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."
För varje exempel
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-handling som åtgärd (av T) -instans. ForEach (action)
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 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) Resultatlista. Poster. Lägg till (_ b. Varumärke & "-" & _ b. Namn & "-" & _ b. Kategori & "-" & _ b. Storlek) End Sub Private Sub ForEachButton_Click (... Resultatlistan. Poster. Rensa () Resultatlista. Poster. Lägg till ("För varje exempel") Resultatlista. Poster. Lägg till ("") skåp. ForEach (AddressOf displayBottle) End Sub
FindAll Exempel
Hitta alla är lite mer komplicerat. Microsoft-dokumentationen för Hitta alla ser ut så här:
Dim-instans som lista Dim-matchning som predikat (av T) Dim returnValue As List (Of T) returnValue = instans. FindAll (matcha)
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 specificerat objekt uppfyller dessa kriterier. "Med andra ord kan du skapa valfri kod som hittar något i lista. Jag kodade min Predikat (av T) att hitta något i "öl" Kategori.
Istället för att anropa 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. Klicka på Resultatlista. Poster. Rensa () Resultatlista. Poster. Lägg till ("FindAll exempel") Resultatlista. Poster. Lägg till ("") Dim sublist som lista (av flaska) sublist = Skåp. FindAll (AddressOf findBeer) för varje r som flaska i sublist ResultatList. Poster. Lägg till (_ r. Varumärke & "-" & _ r. Namn & "-" & _ r. Kategori & "-" & _ r. Storlek) Nästa funktion Underfunktion findBeer (ByVal b som flaska) _ Som boolesk om (b. Kategori = "Öl") Returnera sedan True Else Return False End If End-funktion
Sortera exempel
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:
- Sortera()
- Sortera (IComparer (T))
- Sortera (Jämförelse (T))
- Sortera (Int32, Int32, IComparer (T))
Detta låter dig använda sorteringsmetoder som definierats i .NET Framework för listan, koda dina egna, använda ett system definierad jämförelse för typen, eller sortera en del av samlingen med en startposition och räkning parameter.
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. Namn. JämförTo (y. Namn) (y. Namn)
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 Sortera (Jämförelse )>)). 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. Klicka på Resultatlista. Poster. Rensa () Resultatlista. Poster. Lägg till ("Sortera exempel") Resultatlista. Poster. Lägg till ("") skåp. Sortera (AddressOf sortCabinet) för varje r som flaska i skåp Resultatlista. Poster. Lägg till (_ r. Namn & "-" & _ r. Varumärke & "-" & _ r. Kategori & "-" & _ r. Storlek) Nästa slut Sub Privat delad funktion sortCabinet (_ ByVal x Som flaska, ByVal y som flaska) Som heltal Retur x. Namn. JämförTo (y. Namn) 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!