Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I delete an item from an array in VB.NET?

Tags:

arrays

vb.net

How can I delete an item from an array in VB.NET?

like image 221
vb.net Avatar asked Aug 10 '10 10:08

vb.net


People also ask

How can I remove a specific item from an array?

pop() function: This method is use to remove elements from the end of an array. shift() function: This method is use to remove elements from the start of an array. splice() function: This method is use to remove elements from the specific index of an array.

How do I remove an item from an array index?

Find the index of the array element you want to remove using indexOf , and then remove that index with splice . The splice() method changes the contents of an array by removing existing elements and/or adding new elements. The second parameter of splice is the number of elements to remove.

How do you remove an array from an array?

You can use unset() function which removes the element from an array and then use array_values() function which indexes the array numerically.


1 Answers

As Heinzi said, an array has a fixed size. In order to 'remove an item' or 'resize' it, you'll have to create a new array with the desired size and copy the items you need as appropriate.

Here's code to remove an item from an array:

<System.Runtime.CompilerServices.Extension()> _ Function RemoveAt(Of T)(ByVal arr As T(), ByVal index As Integer) As T()     Dim uBound = arr.GetUpperBound(0)     Dim lBound = arr.GetLowerBound(0)     Dim arrLen = uBound - lBound      If index < lBound OrElse index > uBound Then         Throw New ArgumentOutOfRangeException( _         String.Format("Index must be from {0} to {1}.", lBound, uBound))      Else         'create an array 1 element less than the input array         Dim outArr(arrLen - 1) As T         'copy the first part of the input array         Array.Copy(arr, 0, outArr, 0, index)         'then copy the second part of the input array         Array.Copy(arr, index + 1, outArr, index, uBound - index)          Return outArr     End If End Function 

You can use it as such:

Module Module1      Sub Main()         Dim arr = New String() {"abc", "mno", "xyz"}         arr.RemoveAt(1)     End Sub End Module 

The code above removes the second element ("mno") [which has an index of 1] from the array.

You need to be developing in .NET 3.5 or higher in order to use the extension method. If you're using .NET 2.0 or 3.0, you can call the method as such

arr = RemoveAt(arr, 1) 

I hope this is what you need.

Update

After running tests based on ToolMakerSteve's comment it appears the initial code does not modify the array you want to update because of the ByVal used in the function's declaration. However, writing code like arr = arr.RemoveAt(1) or arr = RemoveAt(arr, 1) does modify the array because it reassigns the modified array to the original.

Find below the updated method (subroutine) for removing an element from an array.

<System.Runtime.CompilerServices.Extension()> _ Public Sub RemoveAt(Of T)(ByRef arr As T(), ByVal index As Integer)     Dim uBound = arr.GetUpperBound(0)     Dim lBound = arr.GetLowerBound(0)     Dim arrLen = uBound - lBound      If index < lBound OrElse index > uBound Then         Throw New ArgumentOutOfRangeException( _         String.Format("Index must be from {0} to {1}.", lBound, uBound))      Else         'create an array 1 element less than the input array         Dim outArr(arrLen - 1) As T         'copy the first part of the input array         Array.Copy(arr, 0, outArr, 0, index)         'then copy the second part of the input array         Array.Copy(arr, index + 1, outArr, index, uBound - index)          arr = outArr     End If End Sub 

Usage of the method is similar to the original, except there is no return value this time so trying to assign an array from the return value will not work because nothing is returned.

Dim arr = New String() {"abc", "mno", "xyz"} arr.RemoveAt(1)  ' Output: {"abc", "mno"} (works on .NET 3.5 and higher) RemoveAt(arr, 1) ' Output: {"abc", "mno"} (works on all versions of .NET fx) arr = arr.RemoveAt(1)  'will not work; no return value arr = RemoveAt(arr, 1) 'will not work; no return value 

Note:

  1. I use a temporary array for the process because it makes my intentions clear and that is exactly what VB.NET does behind the scenes when you do Redim Preserve. If you would like to modify the array in-place using Redim Preserve, see ToolmakerSteve's answer.

  2. The RemoveAt methods written here are extension methods. In order for them to work, you will have to paste them in a Module. Extension methods will not work in VB.NET if they are placed in a Class.

  3. Important If you will be modifying your array with lots of 'removes', it is highly recommended to use a different data structure such as List(Of T) as suggested by other answerers to this question.

like image 60
Alex Essilfie Avatar answered Sep 30 '22 23:09

Alex Essilfie