Offensichtlich haben sich die Vorteile einer Arraylist gegenüber einem normalen Array noch immer nicht überall herumgesprochen. Daher wird noch immer munter mit Arrays gearbeitet, was nicht immer sinnvoll ist.

Grundlagen

Elemente einer Arraylist hinzufügen    ArrayL.Add(“Text”)     
Elemente an eine bestimmte Position hinzufügen   ArrayL.Insert(index,”Text”)
Elemente aus der Arraylist entfernen    ArrayL.Remove(“Text”) 
Element einer bestimmten Position entfernen   ArrayL.RemoveAt(index) 
ArrayList sortieren     ArrayL.Sort    
prüfen, ob eine Arraylist ein bestimmtes Element enthältArrayL.Contains(“Text”)

Beispiel

Erläuterung des Codes:

  • Die Button1_Click-Methode wird ausgeführt, wenn der Benutzer auf einen Button namens Button1 klickt.
  • Eine ArrayList namens ItemList wird erstellt und mit String-Elementen gefüllt.
  • Die Elemente der ArrayList werden zunächst in einer MessageBox angezeigt.
  • Ein neues Element wird an einer spezifischen Position eingefügt, die Liste wird sortiert, ein Element wird entfernt, und ein weiteres Element wird an einem spezifischen Index entfernt.
  • Schließlich werden die verbleibenden Elemente in der ArrayList in einer MessageBox angezeigt.

Warum eine Arraylist anstelle eines Arrays?

Grundsätzlich ähnelt die ArrayList einem Array in der Beziehung, dass eine beliebige Anzahl von Objekten aufgenommen werden kann. Anders als bei einem Array werden dabei jedoch die Objekte nicht über ihren Index eingefügt, sondern über die Add.Methode. Somit entfällt das Redimensionieren des Arrays. Dies ist insbesondere vor dem Hintergrund, dass ein Redim Preserve gerade bei großen Arrays recht lange dauert, von großer Bedeutung.

Bei 100 Elementen spielt dies noch keine relevante Rolle, bei 1000 Elementen liegt der Duchschnitt bei 1000 Durchläufen beim Array bei 2,3 ms bei der Arraylist hingegen bei knapp über 1ms:

Bei 10.000 Elementen wird der Unterschied wesentlich größer. 103ms für den Array vs. 11,5 ms für die Arraylist.

Bei 100.000 Elementen vergeht einem das Spaß an den Arrays, mit Zeiten von mehr als 40.000 ms.

Und was ist mit List(of T)

List(of T) steht der Arraylist in Punkto Performance um nichts nach. Die beiden stellen grundsätzlich die selben Funktionen zur Verfügung (.Add, Remove, RemoveAT, Insert ….) Sie unterscheiden sich grundsätzlich nur dadurch, dass List(of T) von vornherein den Typ festlegt, der in ihr gespeichert wird. List(of String), List(of Double) usw.

Arraylists in VBA?

Wenn nun Arraylists um soviel schneller sind als Arrays, dann stellt sich die Frage, wie man sich in VBA verhalten sollte. Kann man denn auch in VBA Arraylists verwenden? Die Antwort ist ja, sofern man den entsprechenden Verweis setzt. Eine Alternative stellt die VBA.Collection dar. 

Erläuterung:

  • Test ist eine Funktion, die eine Collection-Objekt erstellt und mit Strings befüllt. Jeder String ist von der Form “Test X”, wobei X eine Zahl von 1 bis 100 ist.
  • Das erste Element der Collection (myCollection(1)) wird als Rückgabewert der Funktion verwendet.

Erläuterung:

  • Test2 ist eine Funktion, die eine .NET ArrayList über ein spät gebundenes COM-Objekt (CreateObject("System.collections.arraylist")) erstellt.
  • Es werden ebenfalls 100 Elemente hinzugefügt. Beachten Sie, dass ArrayList bei 0 zu zählen beginnt, daher gibt objArrLst(1) das zweite Element zurück.

Links