Создание сложной структуры с помощью Scripting Dictionary - VBScript - PullRequest
2 голосов
/ 05 августа 2011

Я пытаюсь понять некоторый код, чтобы я мог внести в него изменения. Я довольно новичок в 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

Я не уверен, как это работает для меня, чтобы внести какие-либо изменения в него.

Еще раз спасибо

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Задача: Поддерживать коллекцию людей.

Первая попытка решения: Используйте словарь с числовыми индексами = ключи, основанный на dic.Count

Как указывал sanwar, в словаре хранятся пары ключ-значение. Положить (информация о) человек в словаре, нам нужен класс человека, из которого мы можем создать человека объекты / экземпляры для хранения нескольких информационных элементов.

Минимальный / POC код для класса Person:

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 определяет / печатает синих людей, у каждого из которых есть идентификатор, имя, название и зарплата. Вы создаете людей, вызывая функцию init, передавая подходящие значения для имени, документа и зарплаты членов; идентификатор будет увеличен автоматически (с помощью глобального счетчик вместо правильных данных уровня класса, насколько это возможно в более способных языках ОО).]

и демонстрационный скрипт, чтобы доказать, что мы можем создавать и отображать людей:

  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 пустого словаря равно 0, добавив первый элемент (объект person, содержащий всю необходимую нам информацию) в словаре его .Count увеличивается до 1 (готов к следующему добавлению). Вы легко можете видеть что .Добавить .Счет +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 не являются решением для задания: Вести собрание лиц.

0 голосов
/ 05 августа 2011

В этом случае переменная list содержит Scripting.Dictionary.

. При использовании конструкции VBScript For Each для Scripting.Dictionary каждый ключ в словаре возвращается.Таким образом, в этом случае For Each будет помещать каждый ключ в переменную e на каждой итерации.

Строка: -

 Set le = list(e)

теперь использует ключ для этого циклаискать значение в словаре, связанном с ключом.В этом случае значением является объект, обладающий свойствами.

Следовательно, словарь можно использовать для быстрого и прямого поиска «строки» в «таблице» с помощью ее ключа.Кроме того, как показывает опубликованный вами код, вы можете перечислять каждый ключ и искать каждое значение для «сканирования» всей «таблицы».

...