29

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

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

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

4

5 回答 5

41

案例 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
于 2013-08-16T07:15:48.153 回答
12
Dim arr As Integer() = {1, 2, 3}
Dim newItem As Integer = 4
ReDim Preserve arr (3)
arr(3)=newItem

了解更多信息

于 2013-08-07T08:02:31.600 回答
9

对于那些不知道下一步的人,只需添加新的模块文件并将@jor 代码(我的小黑客,支持“无”数组)放在下面。

Module ArrayExtension
    <Extension()> _
    Public Sub Add(Of T)(ByRef arr As T(), item As T)
        If arr IsNot Nothing Then
            Array.Resize(arr, arr.Length + 1)
            arr(arr.Length - 1) = item
        Else
            ReDim arr(0)
            arr(0) = item
        End If

    End Sub
End Module
于 2015-05-10T11:55:44.553 回答
7

不是很干净,但它有效:)

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

arr = arr.Concat({newItem}).ToArray
于 2016-03-03T23:43:27.433 回答
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 并删除数组。

* 我的代码可能无法编译

于 2013-08-07T13:14:22.840 回答