Gebruik een Lambda expressies met een Generic List

Dit is een reeds eerder gepubliceerde post  van de vorige VBcentral website door André Obelink.

Het gebruik van lambda expressies is niet geheel nieuw in Visual Basic. In voorgaande versies – eigenlijk met de komst van LINQ (.NET 3.x) – was het al beschikbaar. Lambda’s zijn echter wel op een tweetal punten uitgebreid. Naast het feit dat u vanaf Visual Basic 2010 nu multi-line lambda’s kunt gebruiken, kunt u ze nu ook als Function() aanroepen. De beperking van alleen een Sub() kunnen gebruiken is nu verleden tijd en men kan lamda’s ook gebruiken om waarden te retourneren. En dat dit in uw eigen code erg handig kan zijn, bewijst het volgende voorbeeld. We definiëren een tweetal klassen: Country en Countries. Countries is in feite een generic List(Of Country). Tevens heb ik een constructor toegevoegd om het object snel te kunnen initialiseren.

 
Public Class Country 
 
    Public Property CountryID As Integer 
    Public Property Code As String 
    Public Property Name As String 
 
    Public Sub New(countryID As Integer, code As String, name As String) 
 
        ' Stel eigenschappen in  
        Me.Code = code 
        Me.CountryID = countryID 
        Me.Name = name 
 
    End Sub 
 
End Class 
 
Public Class Countries 
 
    Inherits List(Of Country) 
 
End Class 

 
Met deze code zouden we de volgende lijst snel kunnen opbouwen:

 
Private Sub TestButton_Click() Handles TestButton.Click 
 
    Dim someCountries As New Countries 
 
    someCountries.Add(New Country(1, "NL", "Netherlands")) 
    someCountries.Add(New Country(2, "BE", "Belgium")) 
    someCountries.Add(New Country(3, "UK", "United Kingdom")) 
    someCountries.Add(New Country(4, "DE", "Germany")) 
 
End Sub 
 

 
Stel dat we nu een land snel willen kunnen vinden in de lijst op de CountryID en dat we de lijst (Countries) willen uitbreiden met de methode FindByCountryID(). Uw code zal er waarschijnlijk ongeveer als volgt uit zien: doorloop alle items in de lijst, controleer of het CountryID van het huidige land overeenkomt met het opgegeven CountryID en indien dit het geval is retourneert u het huidige object. 
 
 
Public Function FindByCountryID(ByVal countryID As Integer) As Country 
 
    For Each country In Me 
 
        If country.CountryID = countryID Then 
            Return country 
        End If 
 
    Next 
 
    ' Niet gevonden  
    Return Nothing 
 
End Function 
 

 
Om een land op basis van de CountryID nu snel te kunnen vinden, volstaat de volgende code:

 
Dim foundCountry = someCountries.FindByCountryID(2) 
 
' Bepaal of land gevonden is --> toon naam  
If foundCountry IsNot Nothing Then 
 
    MessageBox.Show(foundCountry.Name) 
     
End If 


Hoewel er natuurlijk niets met deze code mis is, kan met behulp van een lambda-expressie de implementatie van FindByCountryID() wel een stuk compacter. We gebruiken de (extension) methode FirstOrDefault() op de generic List(Of) klasse. Deze klasse verwacht als argument een functie die Boolean terug geeft. Het argument begint met het keyword Function(c). Dit betekent dat we aan de functie een argument meegeven van het type Country (we zitten immers in lijst met landen) en deze variable geven we de naam ‘c’. Vervolgens kunnen we aangeven waaraan onze zoekactie moet voldoen: c.CountryID = countryID.

 
Public Function FindByCountryID(ByVal countryID As Integer) As Country 
 
    Return Me.FirstOrDefault(Function(c) c.CountryID = countryID) 
 
End Function 


Het zoeken op een land met CountryID = 2 geeft het volgende resultaat.

 




Happy coding!

André

Nieuwsbrief

Blijf op de hoogte van alles wat op VBcentral gebeurd. Meld je nu aan voor onze nieuwsbrief! »

Over ons

Wij zijn gek op het Microsoft .NET ontwikkelplatform en haar ontwikkeltalen, maar we hebben een sterke voorkeur voor Visual Basic .NET! »

Neem contact op

VBcentral.nl
Bataafseweg 20
7101 PA Winterswijk
Nederland
+31 (543) 538 388
info@vbcentral.nl