2011-08-04 12 views
2

私はいくつかのコードを理解していますので、修正することができます。私はかなりvbscriptで新しいですので、どんな助けもありがとうございます。Scripting Dictionary-VBScriptを使用して複雑な構造を作成する

私は、キーによって制御される異なる行を持つテーブルのように動作するように見えるDictionaryオブジェクトを見ています。何が起こっているのか分かりません。 list.addlist.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 

で1使用するための出力データすることができます。

おかげで再び

+0

[Dictionaryオブジェクトのドキュメント](http://msdn.microsoft.com/en-us/library/x4k5wbx4%28v=VS.85%29.aspx)を見ましたか? –

答えて

0

この場合、変数listScripting.Dictionaryを保持しています。

あなたは辞書内の各キーScripting.Dictionary上のVBScript For Each構文を使用

が返されます。したがって、この場合、 For Eachは各繰り返しで各キーを変数 eにループします。

ライン: -

Set le = list(e) 

は現在のキーに関連付けられている辞書に値を検索するために、このループのためのキーを使用しています。この場合、値はプロパティを持つオブジェクトです。

したがって、辞書を使用して、キーを使用して「テーブル」内の「行」をすばやく直接ルックアップすることができます。また、投稿したコードが示すように、各キーを列挙し、各値をルックアップして「テーブル」全体を「スキャン」することができます。

+0

私は理解しています...しかし、私はまだこの事例では単一のキーでどのように "e"(phnumber、email ...)のようなすべての異なる項目を見つけるかという事実の周りに私の頭を包むことはできませんこれらのアイテムはすべて1つのキーを使用して検索されています。セットアップは、1つのキーに関連付けられた複数の行を持つテーブルのように見えます。私は、スクリプティング辞書がキーとアイテムと1対1の関係を持っていると思っていました。 – sanwar

+0

@sanwar:そこには単一のキー "e"がありません。__is__ __variable__は 'e'と呼ばれ、辞書の各キーを' for each'がそのキーを列挙する順番で格納するために使用されます。 – AnthonyWJones

1

タスク: 人物のコレクションを維持します。溶液に

最初の試み: はsanwarようdic.Count

に基づく数値指数=キーと辞書を使用すると、辞書記憶キーと値のペアを指摘しました。 人を辞書に入れるには、複数の情報要素を保持する人物/インスタンスを という人物を作成できる人物クラスが必要です。人クラスの

最小/ 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を有し、そして 給料。 name、doc、およびwageメンバーに適切な値 を渡して、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に基づく数値指標と辞書が何の解決策ではない理由

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 

示し :あなたは簡単に.Add .Count + 1は時間/労力の無駄です が見ることができますタスクのために:人のコレクションを維持する。

関連する問題