同Scriptiing.Dictionary等价的字典类

写些类的原因是因为个人所写的"模版类".,因为很多免费的个人主页空间(因为阿拉穷啊,没钱买空间啊=.=)都不提供FSO.所以导致Scripting.Dictionary也不能使用,所以那"模版类"就不能运行了.于是就有了自己写一个"字典类"的念头.

此类同Scripting.Dictionary对象的使用没有任何的区别,所以以前是根据Scripting.Dictionary来写的程序,不用怎样的修改就可以使用到此类上.此类并且还比Scripting.Dictionary多了一个Insert方法:Insert(sKey,nKey, nval,nMethod),此方法是将新字典数据插入到存在的以sKey为Key的字典位置.nKey,nVal是新字典数据的Key值和Value 值.nMethod则是插入的位置.如果此值为1,"b","black"或空值,则是插入到以sKey为Key的字典数据后面,否则前面.

代码如下:

''/*====================字典对象类============================================
''/*作者:死在水中的鱼
''/*日期:2004年7月14日.晚
''/*Blog:http://blog.lznews.cn/blog.asp?name=哇哇鱼
''/*版本:1.00 
''/*用法:
''/*Dim objDic,sKey,I,sValue
''/*Set objDic=New DictionaryClass
''/*Add方法:Add(字典的Key值,字典数据)  说明:如果"字典的Key值"已存在则Add方法失败
''/*objDic.Add "a","字母a"  ''Add方法
''/*objDic.Add "b","字母b"   
''/*objDic.Add "c","字母c"
''/*''Insert方法:Insert(被插入位置的Key值,新的字典Key值,新的字典数据,插入方式:b后面,f前面)
''/*objDic.Insert "a","aa","字母aa","b"   
''/*objDic.Insert "b","bb","字母bb","f"
''/*''Exists方法,返回是否存在以"b"为Key值的字典数据
''/*Response.Write objDic.Exists("b")
''/*sKey=objDic.Keys        ''获取Keys集合,(数组集合)
''/*sValue=objDic.Items      ''获取字典数据集合(数组集合)
''/*objDic.Item("a")="aaaaaa"    ''Item属性方法:返回或设置对应Key的字典数据
''/*For I=0 To objDic.Count-1    ''Count属性返回有多少条字典数据
''/*    ''Item属性方法:返回或设置对应Key的字典数据
''/*    Response.Write objDic.Item(sKey(I))&"<br>"
''/*Next
''/*Remove方法:Remove(字典的Key值)
''/*objDic.Remove("a") ''删除Key值为a的字典数据
''/*objDic.RemoveAll  ''清空字典数据
''/*objDic.ErrCode    ''返回操作字典时的一些错误代码(调试时用)
''/*objDic.ClearErr   ''清空错误代码(调试时用)
''/*Set objDic=nothing
''/*说明:
''/*"字典的Key值":除了Add方法外,都可以用字符串或序数(1,2..)使用
''/* 转载时或修改时,请尊重作者的知识产权,保留此说明!
''/*==========================================================================
Class DictionaryClass
Dim ArryObj() ''使用该二维数组来做存放数据的字典
Dim MaxIndex  ''MaxIndex则是ArryObj开始的最大上标
Dim CurIndex  ''字典指针,用来指向ArryObj的指针
Dim C_ErrCode ''错误代码号

Private Sub Class_Initialize
 CurIndex=0  ''从下标0开始
 C_ErrCode=0  ''0表示没有任何错误
 MaxIndex=50  ''默认的大小
 Redim ArryObj(1,MaxIndex)   ''定义一个二维的数组
End Sub

Private Sub Class_Terminate 
Erase ArryObj    ''清除数组
End Sub

Public Property Get ErrCode  ''返回错误代码
  ErrCode=C_ErrCode
End Property

Public Property Get Count  ''返回数据的总数,只返回CurIndex当前值-1即可.
  Count=CurIndex
End Property

Public Property Get Keys ''返回字典数据的全部Keys,返回数组.
  Dim KeyCount,ArryKey(),I
  KeyCount=CurIndex-1
  Redim ArryKey(KeyCount)
  For I=0 To KeyCount
      ArryKey(I)=ArryObj(0,I)
  Next
  Keys=ArryKey
  Erase ArryKey
End Property

Public Property Get Items ''返回字典数据的全部Values,返回数组.
  Dim KeyCount,ArryItem(),I
  KeyCount=CurIndex-1
  Redim ArryItem(KeyCount)
  For I=0 To KeyCount
     If isObject(ArryObj(1,I)) Then
        Set ArryItem(I)=ArryObj(1,I)
  Else
     ArryItem(I)=ArryObj(1,I)
  End If
  Next
  Items=ArryItem
  Erase ArryItem
End Property

Public Property Let Item(sKey,sVal)  ''取得sKey为Key的字典数据
  If sIsEmpty(sKey) Then
  Exit Property
  End If
  Dim i,iType
  iType=GetType(sKey)
  If iType=1 Then  ''如果sKey为数值型的则检查范围
    If sKey>CurIndex Or sKey<1 Then
  C_ErrCode=2
     Exit Property
 End If
  End If
  If iType=0 Then
    For i=0 to CurIndex-1
      If ArryObj(0,i)=sKey Then
      If isObject(sVal) Then
         Set ArryObj(1,i)=sVal
   Else
      ArryObj(1,i)=sVal
   End If
   Exit Property
   End If
    Next
  ElseIf iType=1 Then
         sKey=sKey-1
      If isObject(sVal) Then
         Set ArryObj(1,sKey)=sVal
   Else
      ArryObj(1,sKey)=sVal
   End If
   Exit Property
  End If
  C_ErrCode=2  ''ErrCode为2则是替换或个为sKey的字典数据时找不到数据
End Property

Public Property Get Item(sKey)
  If sIsEmpty(sKey) Then
     Item=Null
  Exit Property
  End If
  Dim i,iType
  iType=GetType(sKey)
  If iType=1 Then  ''如果sKey为数值型的则检查范围
    If sKey>CurIndex Or sKey<1 Then
     Item=Null
  Exit Property
 End If
  End If
  If iType=0 Then
    For i=0 to CurIndex-1
      If ArryObj(0,i)=sKey Then
      If isObject(ArryObj(1,i)) Then
         Set Item=ArryObj(1,i)
   Else
      Item=ArryObj(1,i)
   End If
   Exit Property
   End If
    Next
  ElseIf iType=1 Then
         sKey=sKey-1
      If isObject(ArryObj(1,sKey)) Then
         Set Item=ArryObj(1,sKey)
   Else
      Item=ArryObj(1,sKey)
   End If
   Exit Property
  End If
  Item=Null
End Property

Public Sub Add(sKey,sVal)  ''添加字典
   ''On Error Resume Next
   If Exists(sKey) Or C_ErrCode=9 Then
   C_ErrCode=1 ''Key值不唯一(空的Key值也不能添加数字)
   Exit Sub
End If
   If CurIndex>MaxIndex Then
   MaxIndex=MaxIndex+1 ''每次增加一个标数,可以按场合需求改为所需量
   Redim Preserve ArryObj(1,MaxIndex)
End If
ArryObj(0,CurIndex)=Cstr(sKey)  ''sKey是标识值,将Key以字符串类型保存
if isObject(sVal) Then
   Set ArryObj(1,CurIndex)=sVal  ''sVal是数据
Else
   ArryObj(1,CurIndex)=sVal ''sVal是数据
End If
CurIndex=CurIndex+1
End Sub

''/*==========================================================================
''/*函数作用:插入新的字典数据
''/*参数:sKey=被插入的Key值  nKey=新字典的Key值  nVal=新字典的数据
''/*     sMethod=插入的方式{1,"b","back"}=在sKey的后面位置插入新数据,其它则是前面
''/*==========================================================================
Public Sub Insert(sKey,nKey,nVal,sMethod)
If Not Exists(sKey) Then
   C_ErrCode=4
   Exit Sub
End If
   If Exists(nKey) Or C_ErrCode=9 Then
   C_ErrCode=4  ''Key值不唯一(空的Key值也不能添加数字)
   Exit Sub
End If
sType=GetType(sKey)  ''取得sKey的变量类型
Dim ArryResult(),I,sType,subIndex,sAdd
ReDim ArryResult(1,CurIndex)  ''定义一个数组用来做临时存放地
if sIsEmpty(sMethod) Then sMethod="b" ''为空的数据则默认是"b"
sMethod=lcase(cstr(sMethod))
subIndex=CurIndex-1
sAdd=0
If sType=0 Then  ''字符串类型比较
  If sMethod="1" Or sMethod="b" Or sMethod="back" Then ''将数据插入sKey的后面
       For I=0 TO subIndex
          ArryResult(0,sAdd)=ArryObj(0,I)
    If IsObject(ArryObj(1,I)) Then
      Set ArryResult(1,sAdd)=ArryObj(1,I)
    Else
      ArryResult(1,sAdd)=ArryObj(1,I)
    End If
    If ArryObj(0,I)=sKey Then  ''插入数据
      sAdd=sAdd+1
      ArryResult(0,sAdd)=nKey
   If IsObject(nVal) Then
     Set ArryResult(1,sAdd)=nVal
   Else
     ArryResult(1,sAdd)=nVal
   End If
    End If
    sAdd=sAdd+1
    Next
  Else
       For I=0 TO subIndex
    If ArryObj(0,I)=sKey Then  ''插入数据
      ArryResult(0,sAdd)=nKey
   If IsObject(nVal) Then
     Set ArryResult(1,sAdd)=nVal
   Else
     ArryResult(1,sAdd)=nVal
   End If
   sAdd=sAdd+1
    End If
    ArryResult(0,sAdd)=ArryObj(0,I)
    If IsObject(ArryObj(1,I)) Then
      Set ArryResult(1,sAdd)=ArryObj(1,I)
    Else
      ArryResult(1,sAdd)=ArryObj(1,I)
    End If
    sAdd=sAdd+1
    Next
  End If
ElseIf sType=1 Then
  sKey=sKey-1  ''减1是为了符合日常习惯(从1开始)
  If sMethod="1" Or sMethod="b" Or sMethod="back" Then ''将数据插入sKey的后面
       For I=0 TO sKey   ''取sKey前面部分数据
          ArryResult(0,I)=ArryObj(0,I)
    If IsObject(ArryObj(1,I)) Then
      Set ArryResult(1,I)=ArryObj(1,I)
    Else
      ArryResult(1,I)=ArryObj(1,I)
    End If
    Next
 ''插入新的数据
 ArryResult(0,sKey+1)=nKey
 If IsObject(nVal) Then
    Set ArryResult(1,sKey+1)=nVal
 Else
    ArryResult(1,sKey+1)=nVal
 End If
 ''取sKey后面的数据
       For I=sKey+1 TO subIndex
          ArryResult(0,I+1)=ArryObj(0,I)
    If IsObject(ArryObj(1,I)) Then
      Set ArryResult(1,I+1)=ArryObj(1,I)
    Else
      ArryResult(1,I+1)=ArryObj(1,I)
    End If
    Next
  Else
       For I=0 TO sKey-1  ''取sKey-1前面部分数据
          ArryResult(0,I)=ArryObj(0,I)
    If IsObject(ArryObj(1,I)) Then
      Set ArryResult(1,I)=ArryObj(1,I)
    Else
      ArryResult(1,I)=ArryObj(1,I)
    End If
    Next
 ''插入新的数据
 ArryResult(0,sKey)=nKey
 If IsObject(nVal) Then
    Set ArryResult(1,sKey)=nVal
 Else
    ArryResult(1,sKey)=nVal
 End If
 ''取sKey后面的数据
       For I=sKey TO subIndex
          ArryResult(0,I+1)=ArryObj(0,I)
    If IsObject(ArryObj(1,I)) Then
      Set ArryResult(1,I+1)=ArryObj(1,I)
    Else
      ArryResult(1,I+1)=ArryObj(1,I)
    End If
    Next
  End If
Else
  C_ErrCode=3
  Exit Sub
End If
ReDim ArryObj(1,CurIndex)  ''重置数据
For I=0 To CurIndex
 ArryObj(0,I)=ArryResult(0,I)
 If isObject(ArryResult(1,I)) Then
    Set ArryObj(1,I)=ArryResult(1,I)
 Else
    ArryObj(1,I)=ArryResult(1,I)
 End If
Next
MaxIndex=CurIndex
Erase ArryResult
CurIndex=CurIndex+1 ''Insert后数据指针加一
End Sub

Public Function Exists(sKey) ''判断存不存在某个字典数据
   If sIsEmpty(sKey) Then
      Exists=False
      Exit Function
End If
Dim I,vType
vType=GetType(sKey)
If vType=0 Then
  For I=0 To CurIndex-1
    If ArryObj(0,I)=sKey Then
    Exists=True
    Exit Function
 End If
  Next
ElseIf vType=1 Then
     If sKey<=CurIndex And sKey>0 Then
     Exists=True
     Exit Function
  End If
End If
Exists=False
End Function

Public Sub Remove(sKey)      ''根据sKey的值Remove一条字典数据
If Not Exists(sKey) Then
   C_ErrCode=3
   Exit Sub
End If
sType=GetType(sKey)         ''取得sKey的变量类型
Dim ArryResult(),I,sType,sAdd
ReDim ArryResult(1,CurIndex-2)   ''定义一个数组用来做临时存放地
sAdd=0
If sType=0 Then          ''字符串类型比较
     For I=0 TO CurIndex-1
    If ArryObj(0,I)<>sKey Then
          ArryResult(0,sAdd)=ArryObj(0,I)
    If IsObject(ArryObj(1,I)) Then
      Set ArryResult(1,sAdd)=ArryObj(1,I)
    Else
      ArryResult(1,sAdd)=ArryObj(1,I)
    End If
    sAdd=sAdd+1
 End If
  Next
ElseIf sType=1 Then
  sKey=sKey-1     ''减1是为了符合日常习惯(从1开始)
     For I=0 TO CurIndex-1
    If I<>sKey Then
          ArryResult(0,sAdd)=ArryObj(0,I)
    If IsObject(ArryObj(1,I)) Then
      Set ArryResult(1,sAdd)=ArryObj(1,I)
    Else
      ArryResult(1,sAdd)=ArryObj(1,I)
    End If
    sAdd=sAdd+1
 End If
  Next
Else
  C_ErrCode=3
  Exit Sub
End If
MaxIndex=CurIndex-2
ReDim ArryObj(1,MaxIndex)  ''重置数据
For I=0 To MaxIndex
 ArryObj(0,I)=ArryResult(0,I)
 If isObject(ArryResult(1,I)) Then
    Set ArryObj(1,I)=ArryResult(1,I)
 Else
    ArryObj(1,I)=ArryResult(1,I)
 End If
Next
Erase ArryResult
CurIndex=CurIndex-1  ''减一是Remove后数据指针
End Sub

Public Sub RemoveAll  ''全部清空字典数据,只Redim一下就OK了
   Redim ArryObj(MaxIndex)
CurIndex=0
End Sub

Public Sub ClearErr   ''重置错误
   C_ErrCode=0
End Sub

Private Function sIsEmpty(sVal)  ''判断sVal是否为空值
   If IsEmpty(sVal) Then
   C_ErrCode=9         ''Key值为空的错误代码
   sIsEmpty=True
   Exit Function
End If
   If IsNull(sVal) Then
   C_ErrCode=9        ''Key值为空的错误代码
   sIsEmpty=True
   Exit Function
End If
   If Trim(sVal)="" Then
   C_ErrCode=9        ''Key值为空的错误代码
   sIsEmpty=True
   Exit Function
End If
sIsEmpty=False
End Function

Private Function GetType(sVal)  ''取得变量sVal的变量类型
   dim sType
sType=TypeName(sVal)
   Select Case sType
   Case "String"
      GetType=0
   Case "Integer","Long","Single","Double"
      GetType=1
   Case Else
      GetType=-1
End Select
End Function

End Class

时间: 2024-10-30 00:28:23

同Scriptiing.Dictionary等价的字典类的相关文章

Swift字典类

在Foundation框架中提供一种字典集合,它是由"键-值"对构成的集合.键集合不能重复,值集合没有特殊要求.键和值集合中的元素可以是任何对象,但是不能是nil.Foundation框架字典类也分为NSDictionary不可变字典和NSMutableDictionary可变字典.一.NSDictionary类 NSDictionary有很多方法和属性,下面总结其常用的方法和属性. initWithDictionary: 构造器,通过Swift的Dictionary创建NSDicti

构建可反转排序的泛型字典类(1)--雏形

构建可反转排序的泛型字典类 前言 前段时间为了查找泛型资料,我翻译了O'Reilly 出版的<C# Cookbook>这本书的几个关于泛型的章节.其中"4.8 反转Sorted List里的内容"(见 http://cgbluesky.blog.163.com/blog/static/2412355820081211016581/ )这一节中有一个接近1300行代码的例子.当时看到这个例子吓了一跳,这是一个足以让人头晕眼花的数字.粗略看了一下,感觉代码质量非常高,非常值得我

C#中的Dictionary字典类介绍

关键字:C# Dictionary 字典 作者:txw1958原文:http://www.cnblogs.com/txw1958/archive/2012/11/07/csharp-dictionary.html 说明    必须包含名空间System.Collection.Generic     Dictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值)     键必须是唯一的,而值不需要唯一的     键和值都可以是任何类型(比如:string, int, 自定义类型,等等

问了好多人,没人能帮吗?dictionary字典类Count数目为5999471。报错见图

问题描述 解决方案 解决方案二:你字典里面的内容太多,内存不够了.没有必要一次性加载这么多数据.解决方案三:引用1楼Libby1984的回复: 你字典里面的内容太多,内存不够了.没有必要一次性加载这么多数据. 内存有剩余啊解决方案四:试试x64解决方案五:32位程序,每个程序可用内存空间是4G解决方案六:不是有多少物理内存你就可以用多少内存的,你的系统不是只有你一个程序解决方案七:每个进程都能在Windows中分配到专用内存和共享内存,专用就是不管程序用不用,其它程序都不能用的那块内存,然后真正

构建可反转排序的泛型字典类(9完)--完善

9. 完善 大楼已经盖好,剩下的工作就是装修,装修好就可以入住了 .从本文的题目得知,这是一个可反转排序的集合类,但我们只实现了降序插入 功能,如果希望把升序转换为降序该怎么办呢?此例的解决方法是声明一个代表 排序方向的属性Comparer,并加入一个sort方法,调用sort方法时根据Comparer 属性进行排序: private ListSortDirection _currentSortDirection = ListSortDirection.Descending; public So

构建可反转排序的泛型字典类(8)--实现IDictionary接口

8. 实现IDictionary<TKey, TValue>接口 由于前面实现了 IDictionary接口,现在实现IDictionary<TKey, TValue>也就没什么困难 的了,照葫芦画瓢. 首先改变类声明: public class ReversibleSortedList<TKey, TValue> :IDictionary<TKey, TValue> IDictionary, IEnumerable<KeyValuePair<T

构建可反转排序的泛型字典类(7)--实现IDictionary接口

7. 实现IDictionary接口 前面做了很多努力,现在终于可以实现 IDictionary接口了.当然,之所以要先实现它,目的之一还是为了之前留下的 一点遗憾:在foreach中使用DictionaryEntry访问集合中的元素. 需要 注意,由于ReversibleSortedList类最主要的接口是泛型IDictionary接口,实 现非泛型IDictionary接口主要是考虑到兼容性,试想,你的项目是用.NET 1.0 实现的,但现在你需要使用.NET 2.0继续完善程序并使用到了一

构建可反转排序的泛型字典类(5)--实现IEnumerable接口

5. 实现IEnumerable<KeyValuePair<TKey, TValue>>接口 我们先来看看ReversibleSortedList类的定义: public class ReversibleSortedList<TKey, TValue> : IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValu

构建可反转排序的泛型字典类(4)--IDictionary接口

C#对集合类型有统一的规范.它的好处不言而喻,所有集合类都有一些统一的调用方法和属性,这使得学习成本大大降低.统一的规范就是通过接口来实现的(关于接口,如果不熟,请参考 http://www.enet.com.cn/eschool/video/c/30.shtml ),另一方面一些类也会直接调用这些标准接口,使得我们写出来的类有更好的兼容性.最典型的例子莫过于IEnumerable接口,只要实现了它就可以使用foreach语句进行调用. 我们将要给ReversibleSortedList实现的是