中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual Basic > 综合文章
在VB里巧用集合
作者:未知 时间:2005-08-07 20:50 出处:编程爱好者网站 责编:chinaitpower
              摘要:在VB里巧用集合
李成俊 赵文杰

---- VB 提 供 一 种 很 有 用 的 数 据 类 型 集 合(Collection)。 她 的 工 作 原 理 类 似 与C 里 的 链 表, 可 以 很 方 便 的 实 现 插 入, 删 除。 并 且 在 使 用 了Key 之 后, 检 索 操 作 也 变 得 非 常 简 单。 但 其 编 程 上 的 方 便 却 带 来 了 效 率 上 的 急 剧 下 降( 尤 其 在 大 数 据 量 时 会 让 你 无 法 忍 受)。 以 下 举 两 个 例 子 来 讨 论 一 下 怎 样 把 集 合 和 数 组 结 合 使 用, 使 程 序 在 方 便 和 效 率 之 间 达 到 一 种 平 衡。
---- 1 . 要 求 建 立 一 数 据 结 构, 用 来 保 存 学 生 的 学 号, 姓 名 和 成 绩, 并 在 需 要 时 以 成 绩 的 高 低 按 顺 序 输 出 这 些 信 息。

---- 这 里 我 想 提 供 两 种 解 决 方 法( 当 然 还 有 其 他 方 法)。

---- 第 一 种: 完 全 用 集 合 来 保 存 数 据。

---- 首 先 定 义 一 个 结 构 如 下( 该 结 构 同 时 用 与 第 二 种 方 式)

Type tMyType
   ID As Long
   Name As String
   Score As Integer
End Type
再定义类clsData如下
Public ID As Long
Public Name As String
Public Score As Integer
  并定义插入函数用来接受数据并插入到数据结构中
Public Function InsertToCol(pData As tMyType)
  注释:其中m_ColData保存记录
  Dim myClass As New clsData
  Set myClass = Nothing
  For iLoopCtrl = 1 To m_ColData.Count
    If m_ColData(iLoopCtrl).Score
< = pData.Score Then Exit For
  Next
  myClass.ID = pData.ID
  myClass.Name = pData.Name
  myClass.Score = pData.Score
If m_ColData.Count = 0 Or iLoopCtrl
= m_ColData.Count Then
    m_ColData.Add Item:=myClass
  Else
m_ColIndex.Add Item:=myClass,
  before:=iLoopCtrl
  End If
End Function
这时,对每个记录做处理如下
Public Function OutProcess()
  For iLoopCtrl = 1 To m_ColData.Count
    CurrentID = m_ColData(iLoopCtrl).ID
    CurrentName = m_ColData(iLoopCtrl).Name
CurrentScore = m_ColData(iLoopCtrl).Score
注释:对当前记录做相应处理
  Next
End Function

---- 第 二 种: 将 数 组 与 集 合 结 合 起 来, 用 数 组 保 存 数 据 而 用 集 合 保 存 排 序 信 息。
---- 首 先 定 义 如 下 变 量

Public m_Array(99) As tMyType
注释:根据需要也可以定义成动态数组
Public m_ColIndex As New Collection
注释:用来保存索引信息
向数组中插入数据的函数如下
Public Function InsertToArray(pData As tMyType)
  If iCurIndex > 99 Then Exit Function
  For iLoopCtrl = 1 To m_ColIndex.Count
If m_Array(m_ColIndex(iLoopCtrl)).Score
< = pData.Score Then Exit For
  Next
  If m_ColIndex.Count = 0 Or iLoopCtrl
     = m_ColIndex.Count Then
    m_ColIndex.Add iLoopCtrl - 1
  Else
    m_ColIndex.Add iLoopCtrl - 1, before:=iLoopCtrl
  End If
  m_Array(iCurIndex).ID = pData.ID
  m_Array(iCurIndex).Name = pData.Name
  m_Array(iCurIndex).Score = pData.Score
  iCurIndex = iCurIndex + 1
End Function

这时,对每个记录做处理如下

Public Function OutProcess()
  For iLoopCtrl = 1 To m_ColData.Count
I = m_ColData(iLoopCtrl)
    CurrentID = m_Array(I).ID
    CurrentName = m_Array(I).Name
    CurrentScore = m_Array(I).Score
    注释:对当前记录做相应处理
  Next
End Function

---- * 性 能 分 析
---- 对 于 集 合 来 讲, 随 着 记 录 个 数 的 增 长, 对 集 合 的 操 作 效 率 飞 快 下 降。 因 为, 集 合 按 下 标 查 找 一 记 录 时 首 先 从 集 合 的 头 一 条 记 录 开 始, 顺 序 向 下, 直 到 指 定 的 下 标 位 置。 因 此, 访 问m_ColData(99) 要 比 访 问m_ColData(1) 慢 的 很 多。 而 大 家 都 知 道 数 组 在 内 存 中 是 顺 序 存 放, 因 此, 访 问 某 条 记 录 的 效 率 与 下 标 大 小 无 关。 当 记 录 数 或 每 个 记 录 的 项 目 数 越 大, 效 率 的 提 高 越 明 显。( 大 家 可 以 自 己 写 一 些 测 试 程 序, 具 体 比 较 以 下 它 们 之 间 的 效 率 差 别, 会 感 到 非 常 惊 讶 的)

---- 2 . 当 记 录 有 唯 一 关 键 字, 并 经 常 以 这 个 关 键 字 做 查 询 时 可 以 使 用 以 下 方 法。

---- 定 义 用 于 保 存 数 据 的 结 构 和 结 构 数 组

Type tMyType
  Item_1 As String
注释:为关键字
  Item_2 As String
  Item_3 As String
End Type
Public m_Array() As tMyType
Public m_ColIndex As New Collection
注释:用于保存索引的集合
定义用于保存索引信息的类clsIndex如下
Public Item_Key As String
Public ID_OfArray As Integer
当接受到一条记录pData后插入过程如下
Public Function InsertData(pData As tMyType)
Dim myClass As New clsIndex
ID_OfArray = ID_OfArray + 1
m_Array(ID_OfArray).Item_1 = pData.Item_1
m_Array(ID_OfArray).Item_2 = pData.Item_2
m_Array(ID_OfArray).Item_3 = pData.Item_3
myClass.Item_Key = pData.Item_1
myClass.ID_OfArray = ID_OfArray
m_ColIndex.Add Item:=myClass, Key:=pData.Item_1
End Function
那么,当需要以给出的关键字(mKey)
         取得数据时,用以下方法实现
Current_Item1 = m_Array(myClass(mKey)
    .ID_OfArray).Item_1
Current_Item2 = m_Array(myClass(mKey)
    .ID_OfArray).Item_2
Current_Item3 = m_Array(myClass(mKey)
    .ID_OfArray).Item_3

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有