使用Scripting Dictionary创建复杂结构 - VBScript

时间:2011-08-04 21:02:25

标签: scripting vbscript

我正在尝试理解一些代码,以便我可以对其进行修改。我在vbscript上相当新,所以任何帮助都表示赞赏。

我正在查看一个Dictionary对象,它看起来像一个表,其中不同的行由一个键控制。我不确定发生了什么。命令如 list.add list.count+1ListElement现在比我的联盟略胜一筹。该代码能够使用简单语句

输出数据1次
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

我不确定如何对它进行任何更改。

再次感谢

2 个答案:

答案 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)

现在使用此循环的键来查找与键关联的字典中的值。在这种情况下,值是具有属性的对象。

因此,字典可用于使用其键快速直接查找“表”中的“行”。此外,您发布的代码演示了您可以枚举每个键并查找每个值以“扫描”整个“表”。