我正在尝试理解一些代码,以便我可以对其进行修改。我在vbscript上相当新,所以任何帮助都表示赞赏。
我正在查看一个Dictionary对象,它看起来像一个表,其中不同的行由一个键控制。我不确定发生了什么。命令如
list.add
list.count+1
,ListElement
现在比我的联盟略胜一筹。该代码能够使用简单语句
Sub DumpList ( list )
' This function dumps all the people in the office and their information
' in the application window. The list is usually sorted by Name.
Dim e, le
For Each e In list ' output listelements...
Set le = list(e)
LogOutput 0, "line: " & (le.num, 3) & " : " & le.Name _
& " " & le.PHNumber1 & " " & le.PHNumber2 _
& " " & le.Email1 & " " & le.Email2 _
& " " & le.DeskNo.1 & " " & le.OFficeCode _
& " " & le.wirecolour & " " & le.wirecross
Next
End Sub
我不确定如何对它进行任何更改。
再次感谢
答案 0 :(得分:1)
任务: 维护一个人的集合。
首次尝试解决方案: 使用具有数字索引=键的字典,基于dic.Count
正如sanwar指出的那样,字典存储了键值对。放(信息) 在字典中的人,我们需要一个人类,我们可以从中创造人 用于保存多个信息元素的对象/实例。
Person类的最小/ POC代码:
Dim g_nPersonId : g_nPersonId = -1
Class cPerson
Private m_nId
Private m_sName
Private m_dtBirth
Private m_dWage
Public Function init( sName, dtBirth, dWage )
Set init = Me
g_nPersonId = g_nPersonId + 1
m_nId = g_nPersonId
Name = sName
Birth = dtBirth
Wage = dWage
End Function
Public Property Let Name( sName ) : m_sName = sName : End Property
Public Property Let Birth( dtBirth ) : m_dtBirth = dtBirth : End Property
Public Property Let Wage( dWage ) : m_dWage = dWage : End Property
Public Property Get Id() : Id = m_nId : End Property
Public Property Get Name() : Name = m_sName : End Property
Public Property Get Birth() : m_dtBirth = m_dtBirth : End Property
Public Property Get Wage() : m_dWage = m_dWage : End Property
Public Function Data()
Data = Array( m_nId, m_sName, m_dtBirth, m_dWage )
End Function
End Class ' cPerson
[cPerson类定义/蓝色打印人,每个人都有一个id,一个名字,一个dob,和 薪水。您可以通过调用传递适当值的init函数来创建人员 对于姓名,医生和工资成员; id将自动增强(通过使用全局 在更有能力的OO语言中,尽可能使用计数器代替适当的类级数据。)
和一个演示脚本,以证明我们可以创建和展示人员:
Dim oAdam : Set oAdam = New cPerson.init( "Adam", #1/5/2001#, 1234.56 )
Dim oEve : Set oEve = New cPerson.init( "Eve" , #1/6/2001#, 6543.21 )
Dim oPerson
For Each oPerson In Array( oAdam, oEve )
WScript.Echo Join( oPerson.Data(), " - " )
Next
输出:
0 - Adam - 1/5/2001 - 1234.56
1 - Eve - 1/6/2001 - 6543.21
现在让我们把它们放在带有数字键的字典中(特殊的VBScript) 功能,其他语言都有基于字符串键的词典) .Count属性。通过添加,空字典的.Count属性为0 第一个元素(包含我们需要的所有信息的person对象)到字典 它的.Count递增到1(准备下一次添加)。你很容易看到 那.Add .Count + 1是浪费时间/精力:
Dim dicPersons : Set dicPersons = CreateObject( "Scripting.Dictionary" )
Dim aPersons : aPersons = Array( _
Array( "Adam", #1/5/2001#, 1234.56 ) _
, Array( "Eve" , #1/6/2001#, 6543.21 ) _
)
Dim aPerson
For Each aPerson In aPersons
dicPersons.Add dicPersons.Count, New cPerson.init( aPerson( 0 ), aPerson( 1 ), aPerson( 2 ) )
Next
Dim nPerson
WScript.Echo "Adam & Eve"
For Each nPerson In dicPersons
WScript.Echo nPerson, ":", Join( dicPersons( nPerson ).Data(), " - " )
Next
dicPersons.Remove 0 ' how do we know the key of Adam?
WScript.Echo "Adam zaped"
For Each nPerson In dicPersons
WScript.Echo nPerson, ":", Join( dicPersons( nPerson ).Data(), " - " )
Next
WScript.Echo "Trying to add Caine"
On Error Resume Next
dicPersons.Add dicPersons.Count, New cPerson.init( "Caine", Date(), 0.33 )
WScript.Echo Err.Description
On Error GoTo 0
输出
Adam & Eve
0 : 0 - Adam - 1/5/2001 - 1234.56
1 : 1 - Eve - 1/6/2001 - 6543.21
Adam zaped
1 : 1 - Eve - 1/6/2001 - 6543.21
Trying to add Caine
This key is already associated with an element of this collection
显示为什么基于.Count的数字索引的字典不是解决方案 为了这个任务:保持一个人的集合。
答案 1 :(得分:0)
在这种情况下,变量list
包含Scripting.Dictionary
。
当您在For Each
上使用VBScript Scripting.Dictionary
构造时,会返回字典中的每个键。因此,在这种情况下,For Each
将在每次迭代时将每个键循环放置在变量e
中。
The Line: -
Set le = list(e)
现在使用此循环的键来查找与键关联的字典中的值。在这种情况下,值是具有属性的对象。
因此,字典可用于使用其键快速直接查找“表”中的“行”。此外,您发布的代码演示了您可以枚举每个键并查找每个值以“扫描”整个“表”。