How can I delete an item from an array in VB.NET?
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 IfEnd Function
You can use it as such:
Module Module1 Sub Main() Dim arr = New String() {"abc", "mno", "xyz"} arr.RemoveAt(1) End SubEnd 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 IfEnd 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 valuearr = RemoveAt(arr, 1) 'will not work; no return value
Note:
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 usingRedim Preserve
, see ToolmakerSteve's answer.The
RemoveAt
methods written here are extension methods. In order for them to work, you will have to paste them in aModule
. Extension methods will not work in VB.NET if they are placed in aClass
.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.
You can't. I would suggest that you put the array elements into a List
, at least then you can remove items. An array can be extended, for example using ReDim
but you cannot remove array elements once they have been created. You would have to rebuild the array from scratch to do that.
If you can avoid it, don't use arrays here, use a List
.
One line using LINQ:
Dim arr() As String = {"uno", "dos", "tres", "cuatro", "cinco"}Dim indx As Integer = 2arr = arr.Where(Function(item, index) index <> indx).ToArray 'arr = {"uno", "dos", "cuatro", "cinco"}
Remove first element:
arr = arr.Skip(1).ToArray
Remove last element:
arr = arr.Take(arr.length - 1).ToArray