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)
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
对于那些不知道接下来是什么的人,只需添加新的模块文件并将@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)
| 归档时间: |
|
| 查看次数: |
168328 次 |
| 最近记录: |