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

前端 未结 11 1686
别那么骄傲
别那么骄傲 2020-12-05 18:14

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

相关标签:
11条回答
  • 2020-12-05 18:27

    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.

    0 讨论(0)
  • 2020-12-05 18:33

    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.

    0 讨论(0)
  • 2020-12-05 18:34

    My favorite way:

    Imports System.Runtime.CompilerServices
    
    <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))
    
    0 讨论(0)
  • 2020-12-05 18:37

    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)
    
    0 讨论(0)
  • 2020-12-05 18:41
    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
        Next
    End Sub
    

    try this

    0 讨论(0)
提交回复
热议问题