Het gebruik van lambda expressies is niet geheel nieuw voor Visual Basic 2010. In voorgaande versies – eigenlijk met de komst van LINQ – was het al beschikbaar. Lambda’s zijn echter wel op een tweetal punten uitgebreid. Naast het feit dat u in 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.

  1: Public Class Country
  2:  
  3:     Public Property CountryID As Integer
  4:     Public Property Code As String
  5:     Public Property Name As String
  6:  
  7:     Public Sub New(ByVal countryID As Integer,
  8:                    ByVal code As String,
  9:                    ByVal name As String)
 10:  
 11:         ' Stel eigenschappen in
 12:         Me.Code = code
 13:         Me.CountryID = countryID
 14:         Me.Name = name
 15:  
 16:     End Sub
 17:  
 18: End Class
 19: 
 20:  
 21: Public Class Countries
 22:  
 23:     Inherits List(Of Country)
 24:  
 25: End Class

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

  1: Private Sub TestButton_Click() Handles TestButton.Click
  2:  
  3:     Dim someCountries As New Countries
  4:  
  5:     someCountries.Add(New Country(1, "NL", "Netherlands"))
  6:     someCountries.Add(New Country(2, "BE", "Belgium"))
  7:     someCountries.Add(New Country(3, "UK", "United Kingdom"))
  8:     someCountries.Add(New Country(4, "DE", "Germany"))
  9:  
 10: 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.
 

  1: ' Zoek het land op basis van de CountryID
  2: Public Function FindByCountryID(ByVal countryID As Integer) As Country
  3:  
  4:     For Each country In Me
  5:         If country.CountryID = countryID Then
  6:             Return country
  7:         End If
  8:     Next
  9:  
 10:     ' Niet gevonden
 11:     Return Nothing
 12:  
 13: End Function

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

  1: Dim foundCountry = someCountries.FindByCountryID(2)
  2:  
  3: ' Bepaal of land gevonden is --> toon naam
  4: If foundCountry IsNot Nothing Then
  5: 
  6:    MessageBox.Show(foundCountry.Name)
  7: 
  8: 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.

  1: Public Function FindByCountryID(ByVal countryID As Integer) As Country
  2:  
  3:     Return Me.FirstOrDefault(Function(c) c.CountryID = countryID)
  4:  
  5: End Function

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

BlogScreenshot

Happy coding!

André