2011-08-04 28 views
2

我想了解一些代码,以便我可以对其进行修改。我对vbscript相当新,所以任何帮助表示赞赏。使用Scripting Dictionary创建复杂结构 - VBScript

我正在查看一个字典对象,它看起来像一个表,它的行为像一个表,不同的行由一个键控制。我不确定发生了什么事。命令如 list.addlist.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 

我不知道它是如何工作,我做任何更改。

再次感谢

+0

你看过[Dictionary对象的文档](http://msdn.microsoft.com/en-us/library/x4k5wbx4%28v=VS.85%29.aspx)吗? –

回答

0

在这种情况下可变list持有Scripting.Dictionary

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

行: -

Set le = list(e) 

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

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

+0

我明白了。尽管我仍然无法将自己的头围绕在这个事实上,即如何在这种情况下使用单个键“e”查找所有不同的项目,如(phnumber,email ...)它是怎么回事所有这些项目都使用1键查找。该设置看起来像一个表与多个行关联到1键,我认为脚本字典与键和项目有1对1的关系。 – sanwar

+0

@sanwar:没有单个键“e”存在__是__变量___被称为'e',它用于依次存储字典中的每个键,因为'for each'枚举了它的键。 – AnthonyWJones

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,名称,出生日期,和 工资。您可以通过调用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,通过将 第一个元素(一个持有我们需要的所有信息的人物对象)添加到字典 ,其.Count递增为1(为下一个添加做好准备)。您可以轻松地看到 说。新增.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中与数字索引字典是无解 任务:维护一个人的集合。