扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
另辟蹊径处理字符串中的字符:字节数组法
当要处理字符串中的每一个字符时,可以将字符串赋值到一个byte数组中进行操作。要记住:每一个Unicode字符对应双字节。这种方法通常要快许多,因为节省了大量的Mid$函数操作以及大量的临时字符串空间。下面的代码是统计字符串中空格数目的最快方法
Dim b() as Byte, count As Integer
b() = source$
For i = 0 to UBound(b) Step LenB("A")
If b(i) = 32 Then count = count + 1
Next
请注意上面代码中LenB()函数的特殊用法:在VB4(32位)、VB5和VB6中它返回数值2, 在VB4(16位)中返回数值1。因此,我们就可以使用同一代码段,而无需#If编译指令。
快速清除数组部分内容
清除动态数组的最快方法是使用ReDim,清除静态数组则是使用删除。但是如果只想清除数组的一部分内容,怎么办呢?看上去似乎只能使用For-Next循环了。
如果处理的是数字数组,有一个较快的方法。它基于ZeroMemory API函数,正如函数名所示,它能将一块内存区域填充为0。看看怎么应用这个函数来清除一个Long类型数组的一部分内容:
Private Declare Sub ZeroMemory Lib "kernel32" Alias "RtlZeroMemory" (dest As _
Any, ByVal Bytes As Long)
’定义数组,填充数据
Dim a(1000) As Long
For i = 1 To UBound(a)
a(i) = i
Next
’从a(200)开始清除100个元素内容
ZeroMemory a(200), 100 * Len(a(1))
请注意上述代码中清除长度的表示方法,使用Len()函数保证了当数组类型改变时代码仍然有效。
快速初始化Variant和String类型数组
VB中没有提供定义数组并同时初始化其内容的方法,所以大多数情况下,必须单独地设置每一个元素,就象下面一样:
Dim strArray(0 To 3) As String
strArray(0) = "Spring"
strArray(1) = "Summer"
strArray(2) = "Fall"
strArray(3) = "Winter"
在VB4、VB5和VB6中,可以使用Array()函数随意创建一个Variants类型数组:
Dim varArray() As Variant
varArray() = Array("Spring", "Summer", "Fall", "Winter")
但却没有同样的函数能创建非Variant类型数组。但是我们发现,在VB6中可以使用Split()函数创建字符串数组:
Dim varArray() As String
’由Split建立的数组下标通常是从0开始的
varArray() = Split("Spring;Summer;Fall;Winter", ";")
在VB6中,同样能充分利用函数返回数组的能力,创建数组初始化程序段。比如下面的代码段:
Function ArrayInt(ParamArray values() As Variant) As Integer()
Dim i As Long
ReDim res(0 To UBound(values)) As Integer
For i = 0 To UBound(values)
res(i) = values(i)
Next
ArrayInt = res()
End Function
同时,也可以创建一个子程序段来检测传递给它的数值的类型,并返回正确类型的数组。这种情况下,函数应该定义为返回Variant。
访问简单变量总是快于数组元素值
读写数组中的元素速度通常都慢于访问一个简单变量,因此,如果在一个循环中要重复使用同一数组元素值,就应该分配数组元素值到临时变量中并使用这个变量。下面举一个例子,检测整数数组中是否存在重复项:
Function AnyDuplicates(intArray() As Integer) As Boolean
’如果数组包含重复项,返回True
Dim i As Long, j As Long,
Dim lastItem As Long
Dim value As Integer
’只计算机UBound()一次
lastItem = UBound(intArray)
For i = LBound(intArray) To lastItem
’ 保存intArray(i)到非数组变量中
value = intArray(i)
For j = i + 1 To lastItem
If value = intArray(j) Then
AnyDuplicates = True
Exit Function
End If
Next
Next
’没有发现重复项
AnyDuplicates = False
End Function
上述程序有2层循环,通过缓存intArray(i)的数值到一个普通的、非数组变量中,节省了CPU运行时间。经测试,这将提高80%的速度。
创建新表时,快速拷贝字段
在VB6中,无需离开开发环境就可以创建新的SQL Server和Oracle表。方法很简单:打开DataView窗口,用鼠标右键单击数据库的表文件夹,再选择新表格菜单命令。
当处理相似表格时,就是说具有许多相同字段的表格,我们完全可以在很短的时间内容完成设定操作。具体步骤是:在设计模式下打开源表格,加亮选择要拷贝字段对应的行,按Ctrl-C拷贝信息到粘贴板;然后,在设计模式打开目标表格,将光标置于要粘贴字段所在的位置,按Ctrl-V。
这样,就拷贝了所有的字段名称以及它们所带的属性。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者