Verwerk lijsten in batches

Soms wil je data in batches verwerken. Met behulp van deze extension method, kun je alle collections die afgeleid zijn van een IEnumerable, eenvoudig in batches verwerken. Let op, als je extension methods wilt maken in Visual Basic, dan moeten deze in statische klasse worden geplaatst. In Visual Basic .NET is dit een Module.

 
Imports System.Runtime.CompilerServices 
   
Public Module EnumerableExtensions 
   
  [Extension] 
  Public Iterator Function InBatches(Of T)(source As IEnumerable(Of T), size As Integer) As IEnumerable(Of IEnumerable(Of T)) 
   
    Dim start As Integer = 0 
   
    While start < source.Count() 
        Yield source.Skip(start).Take(size) 
        start += size 
    End While 
   
  End Function 
   
End Module 


Wanneer je goed naar de code kijkt, zal je kunnen opmerken dat je de grootte van de batch kunt opgeven. De methode InBatches() retourneert een IEnumerable(Of IEnumerable(Of)). Het maakt gebruik van ook de standaard LINQ extension methode Skip() en Take(). Eigenlijk dus heel simpel. Naast het gebruik van deze extension methods, maakt het ook gebruik van Iterators. Dit houdt in dat de methode die onze functie consumeert, het resultaat al kan gebruiken in de eerst loop binnen een For...Each.
Het aanroepen van onze methode is misschien nog wel eenvoudiger. We gaan uit van een collectie nummers. In dit voorbeeld wordt die lijst met nummers gemaakt in de methode GetNumbers(), maar die kan natuurlijk elke willekeurige lijst met objecten zijn.

 
Private Function GetNumbers() As List(Of Integer) 
   
    Dim numbers As New List(Of Integer) 
   
    For counter = 1 To 27 
        numbers.Add(counter) 
    Next 
   
    Return numbers 
     
End Function 


Roep de InBatces() extension methode aan en doorloop alle geretourneerde batches.

 
' Get the list of numbers in batches of 5 
Dim numbersInBatches = GetNumbers().InBatches(5) 
   
' Loop trough the batches 
For Each numbersInBatch In numbersInBatches 
   
  ' Loop trough all elements in the batch 
  For Each number In numbersInBatch 
    Debug.Write(number.ToString() & "-") 
  Next 
   
  Debug.WriteLine("") 
   
Next 


Bovenstaande code zal resulteren in een zestal batches. Vijf batches met vijf elementen en de laatste batche met de overgebleven twee elementen.

Ik heb deze post eerder in het Engels gepubliceerd op mijn eigen blog: www.obelink.com

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