¿Hay alguna forma de eliminar elementos repetidos en un Array?
Me he hecho una función, que me ha costado, el ingeniarlo quiero decir, que es la siguiente:
Código
Public Function DeleteArrayRepetitions(ByVal strArray1() As String, ByVal Sorted As Boolean) As Array Dim strArray2(0) As String Dim TempElement As String Dim Count1 As Integer Dim Count2 As Integer For Each TempElement In strArray1 Count1 += 1 If Count1 = 1 Then strArray2(0) = TempElement If Array.IndexOf(strArray1, TempElement, Count1) = -1 Then ReDim Preserve strArray2(Count2) strArray2(Count2) = TempElement Count2 += 1 End If Next If Sorted = True Then Array.Sort(strArray2) Return strArray2 End Function
Lo que hace es comprobar uno por uno los elementos del strArray1 y si no está repetido lo pasa al strArray2, hasta completar una lista sin repeticiones. Una vez el strArray2 está completo lo pasa a la función DeleteArrayRepetitions que también es un Array. Es decir, la función devuelve una lista sin repeticiones.
En un intento de reducirlo más, resulta que obtengo un código más o menos igual solo que esta vez usando Array.LastIndexOf en lugar de Array.IndexOf
Código
Public Function DeleteArrayRepetitions(ByVal strArray1() As String, ByVal Sorted As Boolean) As Array Dim strArray2(0) As String Dim Count As Integer = 0 Dim Count2 As Integer = 0 For Each Element In strArray1 Dim Last As Integer = Array.LastIndexOf(strArray1, Element) If Count = Last Then ReDim Preserve strArray2(Count2) strArray2(Count2) = Element Count2 += 1 End If Count += 1 Next If Sorted = True Then Array.Sort(strArray2) Return strArray2 End Function
Para usarlo se hace los siguiente:
Código
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Numbers() As String = {"1", "5", "5", "5", "4", "1", "12", "4", "55"} 'Quita los elementos repetidos Numbers = DeleteArrayRepetitions(Numbers, True) 'Lista los elementos del Array en un ListBox For Each Element In Numbers ListBox1.Items.Add(Element) Next End Sub
El ListBox mostrará:
1
12
4
5
55
A pesar que las funciones funcionan bien, debe haber alguna forma más sencilla, alguna función en VBNET que permita hacerlo. He probado con Array y ArrayList, pero no he visto nada.
Sl2