【问题标题】:Creating a complex structure with Scripting Dictionary - VBScript使用脚本字典创建复杂结构 - VBScript
【发布时间】:2011-10-20 09:07:10
【问题描述】:

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

我正在查看一个 Dictionary 对象,它看起来就像一个表,其中不同的行由一个键控制。我不确定发生了什么。像这样的命令 list.add list.count+1 , ListElement 现在有点超出我的水平。该代码能够通过简单的语句输出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

我不确定对它进行任何更改对我来说是如何工作的。

再次感谢

【问题讨论】:

标签: scripting vbscript


【解决方案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 将自动增加(通过使用全局 计数器而不是更强大的面向对象语言中尽可能适当的类级别数据)。]

还有一个演示脚本来证明我们可以创建和显示人物:

  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,通过添加 字典的第一个元素(一个包含我们需要的所有信息的人对象) 它的 .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 的数字索引的字典没有解决方案 任务:维护人员集合。

【讨论】:

    【解决方案2】:

    在这种情况下,变量list 包含Scripting.Dictionary

    当您在Scripting.Dictionary 上使用VBScript For Each 构造时,将返回字典中的每个key。因此,在这种情况下,For Each 将在每次迭代时循环将每个键放入变量 e

    线:-

     Set le = list(e)
    

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

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

    【讨论】:

    • 我明白..虽然我仍然无法理解这样一个事实,即在这种情况下,使用单个键“e”如何找到所有不同的项目,如(phnumber,电子邮件。 ..) 如何使用 1 key 查找所有这些项目。该设置看起来像一个表,其中包含与 1 个键关联的多行,我认为脚本字典与键和项具有 1 对 1 的关系。
    • @sanwar: 没有单个键“e”一个名为e变量,用于存储来自字典依次作为for each 枚举其键。
    猜你喜欢
    • 2017-02-14
    • 2011-12-07
    • 2011-10-06
    • 2015-11-08
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    相关资源
    最近更新 更多