将项添加到数组的最快方法

时间:2013-08-07 07:57:13

标签: arrays vb.net dynamic-arrays

将新项目添加到现有阵列的最快方法是什么?

Dim arr As Integer() = {1, 2, 3}
Dim newItem As Integer = 4

(我已经知道,在使用动态动态列表时,您应该使用ListArrayList或类似的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)在这一点上似乎是最快的。还有什么更好的吗?

5 个答案:

答案 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并删除数组。

*我的代码可能无法编译