有一个方法是创建一个长度比原数组少1的新数组。还有其他更简单的方法吗?
您可以使用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 是可以接受的并且更易于阅读。
DropFirstElement
并不更易读。如果通用术语是“Skip”,那么“Drop”可能意味着其他含义。此外,它并没有明确说明它返回一个数组。因此,将其命名为SkipFirstElementAndReturnAsArray
可能会更好。这更好。但是我仍然认为.Skip(1).ToArray()
实际上更易读,更少歧义。 - Enigmativitydim a(n)
...
for i = 1 to ubound(a)
a(i-1) = a(i)
next i
redim preserve a(ubound(a)-1)
结合@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
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