Sprache: VB
Diese Funktion löscht alle Doppelten Einträge aus einer Arraylist (nicht zu verwechseln mit einem Array). Also aus AAABBBCCC wird ABC
Public Function KillDoubleEntries(ByRef RefArray As ArrayList) As Long
Dim Count As Long
For i As Long = 0 To RefArray.Count - 1
For n As Long = i + 1 To RefArray.Count - 1
If i <> n And (RefArray.Count - 1) >= n Then
If RefArray(i).ToString = RefArray(n).ToString Then
RefArray.RemoveAt(i)
Count += 1
n -= 1
End If
End If
Next
Next
Return Count
End Function
Public Function KillDoubleEntries(ByRef RefArray As ArrayList) As Long
Dim Count As Long
For i As Long = 0 To RefArray.Count - 1
For n As Long = i + 1 To RefArray.Count - 1
If i <> n And (RefArray.Count - 1) >= n Then
If RefArray(i).ToString = RefArray(n).ToString Then
RefArray.RemoveAt(i)
Count += 1
n -= 1
End If
End If
Next
Next
Return Count
End Function
Alte URL:
/snippet/doppelte-eintraege-aus-arraylist-loeschen/121
Die Funktion ist ungünstig implementiert und verursacht unnötiger Weise quadratischen, wenn nicht sogar kubischen Aufwand, obwohl man mit linearem Aufwand auskäme. Besser wäre die Elemente der Liste genau einmal durch zugehen und sich in den Keys eines Dictionary die Objekte zu merken, die bereits enthalten sind. Wenn ein Objekt noch nicht enthalten ist (was man mit !ContainsKey feststellen kann), fügt man es am Ende einer neuen Liste hinzu. Nur so erhält man linearen Aufwand. Geschachtelte Schleifen und RemoveAt verursachen dagegen quadratischen oder schlimmeren Aufwand.
ArrayList sollte durch List oder noch besser durch IList o.ä. ersetzt werden.
Auf meinen Kommentar hin, hat Khartak mittlerweile dankenswerterweise ein neues Snippet „Doppelte Arrayeinträge mit linearem Aufwand entfernen“ veröffentlicht:
http://dotnet-snippets.de/dns/Snippet_detail.aspx?=435