将新项目添加到现有阵列的最快方法是什么?
Dim arr As Integer() = {1, 2, 3}
Dim newItem As Integer = 4
(我已经知道,在使用动态动态列表时,您应该使用List
,ArrayList
或类似的IEnumerables
。但是,如果您坚持使用遗产怎么办?使用数组的代码?)
到目前为止我尝试过:
' A) converting to List, add item and convert back
Dim list As List(Of Integer)(arr)
list.Add(newItem)
arr = list.ToArray()
' --> duration for adding 100.000 items: 33270 msec
' B) redim array and add item
ReDim Preserve arr(arr.Length)
arr(arr.Length - 1) = newItem
' --> duration for adding 100.000 items: 9237 msec
' C) using Array.Resize
Array.Resize(arr, arr.Length + 1)
arr(arr.Length - 1) = newItem
' --> duration for adding 100.000 items: 1 msec
' --> duration for adding 100.000.000 items: 1168 msec
A)似乎非常慢,因为每次添加一个项目时,都会完成整个数组的两次转换。 B)看起来更快,但在ReDim Preserve
期间仍然会复制一次数组。 C)在这一点上似乎是最快的。还有什么更好的吗?
答案 0 :(得分:37)
案例C)是最快的。将此作为扩展名:
Public Module MyExtensions
<Extension()> _
Public Sub Add(Of T)(ByRef arr As T(), item As T)
Array.Resize(arr, arr.Length + 1)
arr(arr.Length - 1) = item
End Sub
End Module
用法:
Dim arr As Integer() = {1, 2, 3}
Dim newItem As Integer = 4
arr.Add(newItem)
' --> duration for adding 100.000 items: 1 msec
' --> duration for adding 100.000.000 items: 1168 msec
答案 1 :(得分:8)
对于那些不知道接下来是什么的人,只需添加新的模块文件并在下面放置@jor代码(我的小黑客,支持'无'数组)。
sum
答案 2 :(得分:7)
Dim arr As Integer() = {1, 2, 3}
Dim newItem As Integer = 4
ReDim Preserve arr (3)
arr(3)=newItem
了解更多信息Redim
答案 3 :(得分:4)
不是很干净但是有效:)
receive message
答案 4 :(得分:0)
这取决于您插入或阅读的频率。如果需要,您可以将数组增加多个。
numberOfItems = ??
' ...
If numberOfItems+1 >= arr.Length Then
Array.Resize(arr, arr.Length + 10)
End If
arr(numberOfItems) = newItem
numberOfItems += 1
同样对于A,您只需要在需要时获取数组。
Dim list As List(Of Integer)(arr) ' Do this only once, keep a reference to the list
' If you create a new List everything you add an item then this will never be fast
'...
list.Add(newItem)
arrayWasModified = True
' ...
Function GetArray()
If arrayWasModified Then
arr = list.ToArray()
End If
Return Arr
End Function
如果您有时间,我建议您将其全部转换为List并删除数组。
*我的代码可能无法编译