Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

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))
        '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))
        '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:

  • 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.

  • 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.

  • 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.

    Alex's answer shows the technique, but because he passes ByVal, the caller's array variable is not changed. Correct usage would be "arr = arr.RemoveAt(1)". Or see my answer for an alternate implementation, which DOES work with merely "arr.RemoveAt(1)". Alex's is preferable, if you want to avoid overwriting the old array (e.g. "arr2 = arr1.RemoveAt(1)"), or if you prefer a coding style that makes it obvious that this is altering the array. – ToolmakerSteve Jun 17, 2013 at 1:02

    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.

    Dim arr() As String = {"uno", "dos", "tres", "cuatro", "cinco"}
    Dim indx As Integer = 2
    arr = 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
    

    That depends on what you mean by delete. An array has a fixed size, so deleting doesn't really make sense.

    If you want to remove element i, one option would be to move all elements j > i one position to the left (a[j - 1] = a[j] for all j, or using Array.Copy) and then resize the array using ReDim Preserve.

    So, unless you are forced to use an array by some external constraint, consider using a data structure more suitable for adding and removing items. List<T>, for example, also uses an array internally but takes care of all the resizing issues itself: For removing items, it uses the algorithm mentioned above (without the ReDim), which is why List<T>.RemoveAt is an O(n) operation.

    There's a whole lot of different collection classes in the System.Collections.Generic namespace, optimized for different use cases. If removing items frequently is a requirement, there are lots of better options than an array (or even List<T>).

    Yes, you can delete an element from an array. Here is an extension method that moves the elements as needed, then resizes the array one shorter:

    ' Remove element at index "index". Result is one element shorter.
    ' Similar to List.RemoveAt, but for arrays.
    <System.Runtime.CompilerServices.Extension()> _
    Public Sub RemoveAt(Of T)(ByRef a() As T, ByVal index As Integer)
        ' Move elements after "index" down 1 position.
        Array.Copy(a, index + 1, a, index, UBound(a) - index)
        ' Shorten by 1 element.
        ReDim Preserve a(UBound(a) - 1)
    End Sub
    

    Usage examples (assuming array starting with index 0):

    Dim a() As String = {"Albert", "Betty", "Carlos", "David"}
    a.RemoveAt(0)    ' Remove first element => {"Betty", "Carlos", "David"}
    a.RemoveAt(1)    ' Remove second element => {"Betty", "David"}
    a.RemoveAt(UBound(a))    ' Remove last element => {"Betty"}
    

    Removing First or Last element is common, so here are convenience routines for doing so (I like code that expresses my intent more readably):

    <System.Runtime.CompilerServices.Extension()> _
    Public Sub DropFirstElement(Of T)(ByRef a() As T)
        a.RemoveAt(0)
    End Sub
    <System.Runtime.CompilerServices.Extension()> _
    Public Sub DropLastElement(Of T)(ByRef a() As T)
        a.RemoveAt(UBound(a))
    End Sub
    

    Usage:

    a.DropFirstElement()
    a.DropLastElement()
    

    And as Heinzi said, if you find yourself doing this, instead use List(Of T), if possible. List already has "RemoveAt" subroutine, and other routines useful for inserting/deleting elements.

    <Extension()> _ Public Sub RemoveAll(Of T)(ByRef arr As T(), matching As Predicate(Of T)) If Not IsNothing(arr) Then If arr.Count > 0 Then Dim ls As List(Of T) = arr.ToList ls.RemoveAll(matching) arr = ls.ToArray End If End If End Sub

    Then in the code, whenever I need to remove something from an array I can do it by some property in some object in that array having a certain value, like:

    arr.RemoveAll(Function(c) c.MasterContactID.Equals(customer.MasterContactID))
    

    Or if I already know the exact object I want to remove, I can just do:

    arr.RemoveAll(function(c) c.equals(customer))
                    for me, System.Array.Clear only clears the array item, it does not remove it. For example, in my string array, it makes the item an empty string within the array. I believe copying the array into a List, then removing the item in the list, and finally copying the list back into the array works most efficiently.
    – Mark Entingh
                    Dec 8, 2014 at 5:18
    
    Public Sub ArrayDelAt(ByRef x As Array, ByVal stack As Integer)
        For i = 0 To x.Length - 2
            If i >= stack Then
                x(i) = x(i + 1)
                x(x.Length-1) = Nothing
            End If
    End Sub
    

    try this

    Seems like this sounds more complicated than it is...

        Dim myArray As String() = TextBox1.Lines
        'First we count how many null elements there are...
        Dim Counter As Integer = 0
        For x = 0 To myArray.Count - 1
            If Len(myArray(x)) < 1 Then
                Counter += 1
            End If
        'Then we dimension an array to be the size of the last array
        'minus the amount of nulls found...
        Dim tempArr(myArray.Count - Counter) As String
        'Indexing starts at zero, so let's set the stage for that...
        Counter = -1
        For x = 0 To myArray.Count - 1
            'Set the conditions for the new array as in
            'It .contains("word"), has no value, length is less than 1, ect.
            If Len(myArray(x)) > 1 Then
                Counter += 1
                'So if a value is present, we move that value over to
                'the new array.
                tempArr(Counter) = myArray(x)
            End If
    

    Now you can assign tempArr back to the original or what ever you need done with it as in...

    TextBox1.Lines = tempArr (You now have a textbox void of blank lines)

    If the array is a string array you are able to then do the following:

    AlphaSplit = "a\b\c".Split("\")
    MaxIndex   = AlphaSplit.GetUpperBound(0)
    AlphaSplit = AlphaSplit.Where(Function(item, index) index <> MaxIndex).ToArray
    AlphaJoin  = String.Join("\", PublishRouteSplit)
    

    How about this method: Get a method which return an array, say tempArray tempArray is supposed to have at least 1 less element to your array, say permArray The method should take and integer param (this will be the index of the unwanted element) say ommitIndex and your permArray

    In the method, copy all elements excluding the element as position ommitIndex from permArray to tempArray

    The method returns tempArray so update permArray with the method.

    Here's a snippet

    Function updateArray(ommitIndex As Integer, array() As String) As Array
        Dim tempArray(array.Length - 2) As String
        Dim counter As Integer = 0
        For i As Integer = 0 To (array.Length - 1)
            If (i <> ommitIndex) Then
                tempArray(counter) = array(i)
                counter += 1
            End If
        Return tempArray
    End Function
            

    Thanks for contributing an answer to Stack Overflow!

    • Please be sure to answer the question. Provide details and share your research!

    But avoid

    • Asking for help, clarification, or responding to other answers.
    • Making statements based on opinion; back them up with references or personal experience.

    To learn more, see our tips on writing great answers.

  •