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

jor*_*jor 23 vb.net arrays dynamic-arrays

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

Dim arr As Integer() = {1, 2, 3}
Dim newItem As Integer = 4
Run Code Online (Sandbox Code Playgroud)

(我已经知道,随着项目的动态列表工作时,你应该宁可使用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
Run Code Online (Sandbox Code Playgroud)

A)似乎非常慢,因为每次添加一个项目时,都会完成整个数组的两次转换.B)看起来更快,但仍然在数组中复制一次ReDim Preserve.C)在这一点上似乎是最快的.有更好的吗?

jor*_*jor 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
Run Code Online (Sandbox Code Playgroud)

用法:

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
Run Code Online (Sandbox Code Playgroud)

  • 我是一个长期使用 VB 进行概念验证项目的 Python 用户。当我发现 VB 不支持将内容动态添加到数组的 '.add()' 方法时,我偶然发现了您的解决方案,但是当我将您的代码放入模块时,Visual Studio 会在 ```&lt;extension()&gt; 下划线``` 并报告“System.Runtime.CompilerServices.ExtensionAttribute 在此上下文中无法访问,因为它是 'Friend'”我很困惑,因为 sub 是公共的,而模块是公共的。对我正在做的事情有什么想法吗? (2认同)
  • 添加导入 System.Runtime.CompilerServices 以使用扩展 (2认同)

Mas*_*uso 8

Dim arr As Integer() = {1, 2, 3}
Dim newItem As Integer = 4
ReDim Preserve arr (3)
arr(3)=newItem
Run Code Online (Sandbox Code Playgroud)

了解更多信息Redim

  • 从技术上讲,你应该写一下:ReDim Preserve arr(3),否则你的数组尺寸过大1.我个人并不太关心这个问题(我几乎每次都过多地排列数组)但是我猜测这将是一个更恰当的答案. (4认同)

Eri*_* F. 8

对于那些不知道接下来是什么的人,只需添加新的模块文件并将@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
Run Code Online (Sandbox Code Playgroud)


小智 5

不是很干净,但是可以用:)

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

arr = arr.Concat({newItem}).ToArray
Run Code Online (Sandbox Code Playgroud)