VB.NET如何从数组中移除第一个元素?

5

有一个方法是创建一个长度比原数组少1的新数组。还有其他更简单的方法吗?


请问您能否提供一份代码示例,说明您正在尝试做什么,并提供更多关于出现问题的信息? - paulsm4
1
请参考https://dev59.com/wXA75IYBdhLWcg3wJFiY#15182002,了解删除数组中任意元素的通用解决方案,而不仅仅是第一个元素。 - ToolmakerSteve
4个回答

15

您可以使用LINQ在非常简洁的代码中生成结果:

Dim a2 = a.Skip(1).ToArray();

你可能会有人说这个方法很慢,应该使用Array.Copy代替:

Dim a2(a.Length - 2) as Integer 
Array.Copy(a, 1, a2, 0, a.Length - 1)

不过,我用一个包含 1,000,000 个元素的整数数组测试了两种方法的时间,发现使用 LINQ 花费了 29 毫秒,而直接复制则只需 3 毫秒。除非你正在处理成千上万个元素的疯狂数学问题,否则 LINQ 是可以接受的并且更易于阅读。


关于“LINQ很好且更易读”的问题,更易读的方法是定义一个方法,删除数组的第一个元素,然后调用该方法。请参见我的答案中关于https://dev59.com/wXA75IYBdhLWcg3wJFiY#15182002的DropFirstElement。如果您喜欢上面的LINQ代码,则应在DropFirstElement中添加“a = a.Skip(1).ToArray ()”的代码行。或者为了避免修改输入数组,请将其定义为“Public Function DropFirstElement(Of T)(ByVal a()As T)As T()”,并包含内容“Return a.Skip(1).ToArray()”。 - ToolmakerSteve
1
@ToolmakerSteve - 我要晚些时候不同意。称呼一个方法为DropFirstElement并不更易读。如果通用术语是“Skip”,那么“Drop”可能意味着其他含义。此外,它并没有明确说明它返回一个数组。因此,将其命名为SkipFirstElementAndReturnAsArray可能会更好。这更好。但是我仍然认为.Skip(1).ToArray()实际上更易读,更少歧义。 - Enigmativity
好的,我理解你的想法了。在使用枚举器时,“跳过”是有意义的。顺便说一下,“drop”是一个古老的术语——我认为它来自LISP。我要指出的是,没有理由说它返回一个数组:我们正在使用数组,所以预期结果就是一个数组。你需要在LINQ版本中指定“ToArray”的唯一原因是Skip从原始数组转换为枚举器。总之,如果一个人在思考“枚举器”,那么你说的是有道理的。但如果一个人只是操作一个“数组”,需要说“ToArray”有点不舒服。 - ToolmakerSteve

4
这里有一种在vb.net中移除数组中第一个元素的方法。
dim a(n)
...
for i = 1 to ubound(a)
  a(i-1) = a(i)
  next i
redim preserve a(ubound(a)-1)

你可以编写一个函数来移除数组中的任意元素(为for循环的初始值设置一个参数)。

1
虽然技术上是正确的,但使用循环解决此问题是一种代价高昂的方式。请查看Enigmativity的答案。或者查看https://dev59.com/wXA75IYBdhLWcg3wJFiY#15182002,了解支持删除任何元素而不仅仅是第一个元素的回答。 - ToolmakerSteve

4

结合@xpda和@Enigmativity的答案,可以看出Array.Copy方法可以安全地用于将内容复制回原始数组。以下是来自msdn Array.Copy方法页面的引用:

如果sourceArray和destinationArray重叠,则此方法的行为就好像在覆盖destinationArray之前,在临时位置保留了sourceArray的原始值。

这里有一个(扩展)子程序,可以删除任何类型数组的指定索引处的元素:

' 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

使用示例(假设数组从索引0开始):

a.RemoveAt(0)    ' Remove first element
a.RemoveAt(1)    ' Remove second element.
a.RemoveAt(UBound(a))    ' Remove last element

0
Public xArray as variant

Function Array_DeleteFirstItem()
    Dim i As Integer
    For i = 0 To UBound(xArray) - 1
        xArray (LBound(xArray) + i) = xArray(LBound(NotContainsArray) + i + 1)
    Next
    ReDim Preserve xArray(UBound(NotContainsArray) - 1)

    For i = 0 To UBound(xArray)
        Debug.Print xArray(i)
    Next
End Function

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接