扩展/合并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的内存都会增加一倍。这意味着更少的内存改组。