【原创】在 VBScript 中使用有序列表(SortedList)

发布时间 2023-07-24 09:49:21作者: 老刘001

环境要求

  • Windows XP 及以上。
  • Windows 10Windows 11Windows 功能 中勾选 .NET Framework 3.5 (包括 .NET 2.0 和 3.0)

前置知识

WSH.Echo Empty = Empty
-1
WSH.Echo Null = Null
null
WSH.Echo New RegExp Is New RegExp
0
Set oRE = New RegExp
WSH.Echo oRE Is oRE
-1
WSH.Echo CreateObject("Scripting.FileSystemObject") Is CreateObject("Scripting.FileSystemObject")
0
Set oFS = CreateObject("Scripting.FileSystemObject")
WSH.Echo oFS Is oFS
-1

下面两个返回值出现的原因是浮点误差:

WSH.Echo 0.1 + 0.2 = 0.3
0
WSH.Echo 100000000000000000000000 = 100000000000000000000001
-1

使用

创建一个 SortedList 对象:

Set oSL = CreateObject("System.Collections.SortedList")

Capacity 属性:返回有序列表目前的容量

Set oSL = CreateObject("System.Collections.SortedList")
WSH.Echo oSL.Capacity()
0
oSL.Add 1, 1
WSH.Echo oSL.Capacity()
16

Count 属性:返回有序列表包含元素的个数

Set oSL = CreateObject("System.Collections.SortedList")
WSH.Echo oSL.Count()
0
oSL.Add 1, 1
WSH.Echo oSL.Count()
1

IsFixedSize 属性:是否具有固定大小

会返回 False

Set oSL = CreateObject("System.Collections.SortedList")
WSH.Echo oSL.IsFixedSize()
0

IsReadOnly 属性:是否为只读

会返回 False

Set oSL = CreateObject("System.Collections.SortedList")
WSH.Echo oSL.IsReadOnly()
0

IsSynchronized 属性:访问是否同步(是否线程安全)

由于 VBScript 是单线程的,该属性无意义。

会返回 False

Set oSL = CreateObject("System.Collections.SortedList")
WSH.Echo oSL.IsSynchronized()
0

Item 属性:表示有序列表中指定键对应的值

参数:键(整数)。

Set oSL = CreateObject("System.Collections.SortedList")
WSH.Echo TypeName(oSL.Item(0))
Empty
WSH.Echo oSL.Contains(0)
0
oSL.Item(0) = 2333
WSH.Echo oSL.Contains(0), oSL.Item(0)
-1 2333
Set oRE = New RegExp
Set oSL.Item(0) = oRE
Set oSL.Item(1) = oRE
Set oSL.Item(-1) = oRE
WSH.Echo oSL.Item(0) Is oRE, oSL.Item(1) Is oRE, oSL.Item(-1) Is oRE
-1 -1 -1

Default 默认属性:表示有序列表中指定键对应的值

Item 属性。

Set oSL = CreateObject("System.Collections.SortedList")
WSH.Echo TypeName(oSL(0))
Empty
WSH.Echo oSL.Contains(0)
0
oSL(0) = 2333
WSH.Echo oSL.Contains(0), oSL(0)
-1 2333
Set oRE = New RegExp
Set oSL(0) = oRE
Set oSL(1) = oRE
Set oSL(-1) = oRE
WSH.Echo oSL(0) Is oRE, oSL(1) Is oRE, oSL(-1) Is oRE
-1 -1 -1

Add 方法:添加新的键值对

参数:键(整数)、值。

若键已经存在,则会抛出异常。

Set oSL = CreateObject("System.Collections.SortedList")
For i = 0 To 9
    oSL.Add i, CStr(i)
Next
WSH.Echo oSL.Count()
10

Clear 方法:清空有序数组

Set oSL = CreateObject("System.Collections.SortedList")
oSL.Add 0, 0
WSH.Echo oSL.Count()
1
oSL.Clear
WSH.Echo oSL.Count()
0

Clone 方法:创建有序数组的副本

Set oSL = CreateObject("System.Collections.SortedList")
Set oSL2 = oSL
Set oSL3 = oSL.Clone()
oSL.Add 0, 0
WSH.Echo oSL.Count(), oSL2.Count(), oSL3.Count()
1 1 0

Contains 方法:判断有序数组是否包含指定键

Set oSL = CreateObject("System.Collections.SortedList")
WSH.Echo oSL.Contains(0)
0
oSL.Add 0, 1
WSH.Echo oSL.Contains(0)
-1

ContainsKey 方法:判断有序数组是否包含指定键

Contains 方法。

Set oSL = CreateObject("System.Collections.SortedList")
WSH.Echo oSL.ContainsKey(0)
0
oSL.Add 0, 1
WSH.Echo oSL.ContainsKey(0)
-1

ContainsValue 方法:判断有序数组是否包含指定值

Set oSL = CreateObject("System.Collections.SortedList")
WSH.Echo oSL.ContainsValue(1)
0
oSL.Add 0, 1
WSH.Echo oSL.ContainsValue(1)
-1

Equals 方法:判断是否是同一个有序数组对象

Set oSL = CreateObject("System.Collections.SortedList")
Set oSL2 = oSL
Set oSL3 = oSL.Clone()
WSH.Echo oSL.Equals(oSL2), oSL.Equals(oSL3)
-1 0

GetByIndex 方法:获得指定索引处的值

索引从 0 开始。

可配合 Count 属性使用。

Set oSL = CreateObject("System.Collections.SortedList")
oSL(-1) = 111
oSL(0) = 222
oSL(1) = 333
WSH.Echo oSL.GetByIndex(0), oSL.GetByIndex(1), oSL.GetByIndex(2)
111 222 333

GetHashCode 方法:获得对象的哈希值

Set oSL = CreateObject("System.Collections.SortedList")
Set oSL2 = oSL
Set oSL3 = oSL.Clone()
WSH.Echo oSL.GetHashCode(), oSL2.GetHashCode(), oSL3.GetHashCode()
54267293 54267293 18643596

GetKey 方法:获得指定索引处的键

索引从 0 开始。

可配合 Count 属性使用。

Set oSL = CreateObject("System.Collections.SortedList")
oSL(111) = -1
oSL(222) = 0
oSL(333) = 1
WSH.Echo oSL.GetKey(0), oSL.GetKey(1), oSL.GetKey(2)
111 222 333

GetKeyList 方法:获得由键组成的列表

返回的列表可使用 Item 或默认属性(效果相同)。

可配合有序列表的 Count 属性使用。

Set oSL = CreateObject("System.Collections.SortedList")
For i = 0 To 9
    oSL.Add i, CStr(i)
Next
Set oKL = oSL.GetKeyList()
WSH.Echo oKL.Item(0), oKL(1)
0 1

GetValueList 方法:获得由值组成的列表

返回的列表可使用 Item 或默认属性(效果相同)。

可配合有序列表的 Count 属性使用。

Set oSL = CreateObject("System.Collections.SortedList")
For i = 0 To 9
    oSL.Add i, CStr(i) & CStr(i)
Next
Set oVL = oSL.GetValueList()
WSH.Echo oVL.Item(0), oVL(1)
00 11

IndexOfKey 方法:返回键对应的索引

索引从 0 开始。

Set oSL = CreateObject("System.Collections.SortedList")
For i = -10 To 10
    oSL.Add i, i
Next
WSH.Echo oSL.IndexOfKey(0)
10

IndexOfValue 方法:返回值对应的索引

索引从 0 开始。

Set oSL = CreateObject("System.Collections.SortedList")
For i = -10 To 10
    oSL.Add i, i + 10
Next
WSH.Echo oSL.IndexOfValue(10)
10

Remove 方法:移除指定键对应的键值对

Set oSL = CreateObject("System.Collections.SortedList")
oSL.Add 1, 2
WSH.Echo oSL(1)
2
oSL.Remove 1
WSH.Echo TypeName(oSL(1))
Empty

RemoveAt 方法:移除指定索引对应的键值对

索引从 0 开始。

Set oSL = CreateObject("System.Collections.SortedList")
oSL.Add 1, 2
WSH.Echo oSL(1)
2
oSL.RemoveAt 0
WSH.Echo TypeName(oSL(1))
Empty

SetByIndex 方法:替换指定索引对应键值对的值

Set oSL = CreateObject("System.Collections.SortedList")
oSL.Add 1, 2
WSH.Echo oSL(1)
2
oSL.SetByIndex 0, -1
WSH.Echo oSL(1)
-1

ToString 方法:返回有序列表的类型

Set oSL = CreateObject("System.Collections.SortedList")
WSH.Echo oSL.ToString(), TypeName(oSL)
System.Collections.SortedList SortedList

TrimToSize 方法:将容量设置为与实际元素个数相同

Set oSL = CreateObject("System.Collections.SortedList")
oSL.Add 1, 1
WSH.Echo oSL.Count, oSL.Capacity
1 16
oSL.TrimToSize
WSH.Echo oSL.Count, oSL.Capacity
1 1

参考