扩展/合并VB阵列

时间:2020-03-05 18:57:15  来源:igfitidea点击:

我有一个带有公共字节数组的类。可以说它

Public myBuff as byte()

类中的事件获取字节数组中的数据块。我如何告诉事件代码将获取块放在最后?可以说

Private Sub GetChunk
  Dim chunk as byte
  '... get stuff in chunk
  Me.myBuff += chunk '(stick chunk on end of public array)
End sub

还是我完全忘记了要点?

解决方案

回答

如果我没记错的话,在vb中,我们想用save重做一个数组。

回答

我们将不断使用ReDim关键字,该关键字效率极低。

我们正在使用.Net吗?如果是这样,请考虑改用System.Collections.Generic.List(Of Byte)。我们可以使用它的.AddRange()方法添加字节,如果需要,可以使用.ToArray()方法获取数组。

回答

问题似乎不太清楚。我们可能不应该将字节数组设置为public。它可能应该是私有的,并且我们应该提供一组公共函数,以允许该类的用户对数组执行操作。

回答

我认为我们可能正在寻找数组以外的其他东西。如果我们尝试逐渐逐渐扩展数据量,则应使用动态数据结构,例如ArrayList。它有一个"添加"方法,可以将特定的对象或者值添加到数组中,而无需担心空间。它也有一个漂亮的ToArray()方法可以使用。

如果我们出于特定原因(我想是性能)而尝试使用数组,请使用ReDim Preserve array(newSize)。

回答

如果数组很小,并且很少添加新数据,那么一种简单的方法是:

public BufferSize as long 'or you can just use Ubound(mybuff), I prefer a tracker var tho
public MyBuff

private sub GetChunk()
dim chunk as byte
'get stuff
BufferSize=BufferSize+1

redim preserve MyBuff(buffersize)
mybuff(buffersize) = chunk
end sub

如果块是字节数组,则它看起来像:

buffersize=buffersize+ubound(chunk) 'or if it's a fixed-size chunk, just use that number
redim preserve mybuff(buffersize)
for k%=0 to ubound(chunk) 'copy new information to buffersize
  mybuff(k%+buffersize-ubound(chunk))=chunk(k%)
next

如果我们经常执行此操作(例如每秒执行多次),则需要执行类似StringBuilder类的工作方式:

public BufSize&,BufAlloc& 'initialize bufalloc to 1 or a number >= bufsize
public MyBuff() as byte

sub getdata()
bufsize=bufsize+ubound(chunk)
if bufsize>bufalloc then
  bufalloc=bufalloc*2
  redim preserve mybuff(bufalloc)
end if
for k%=0 to ubound(chunk) 'copy new information to buffersize
  mybuff(k%+bufsize-ubound(chunk))=chunk(k%)
next
end sub

基本上,每次指针通过缓冲区末尾时,分配给mybuf的内存都会增加一倍。这意味着更少的内存改组。