VB中的Dictionary對象

簡單的理解:Dictionary對象相當於二維數組,但比二維數組更靈活,可以隨時操縱其中某個鍵,而二維數組還要遍歷。

1. Dictionary對象的成員概要
當增加一個鍵/條目對時,如果該鍵已存在;或者刪除一個鍵/條目對時,該關鍵字/條目對不存在,或改變已包含數據的Dictionary對象的CompareMode,都將產生錯誤。
屬 性 說 明
CompareMode (僅用於VBScript)設定或返回鍵的字符串比較模式
Count 只讀。返回Dictionary裏的鍵/條目對的數量 ---從1開始,而不像數組從0開始計數
Item(key) 設定或返回指定的鍵的值
Key(key) 設定鍵名值


方法說明
Add(key,item) 增加鍵/條目對到Dictionary
Exists(key) 如果指定的鍵存在,返回True,否則返回False
Items() 返回一個包含Dictionary對象中所有條目的數組
Keys() 返回一個包含Dictionary對象中所有鍵的數組
Remove(key) 刪除一個指定的鍵/條目對
RemoveAll() 刪除全部鍵/條目對

2. 對Dictionary中增加和刪除條目
一旦得到一個新的(空的)Dictionary,可以對其添加條目,從中獲取條目以及刪除條目:
‘ In VBScript:
objMyData.Add “MyKey”, “MyItem”
objMyData.Add “YourKey”, ”YourItem”
blnIsThere = objMyData.Exists(“MyKey”)
strItem = objMyData.Item(“YourKey”)
strItem = objMyData.Remove(“MyKey”)
objMyData.RemoveAll

3. 修改鍵或條目的值
可以通過修改鍵的值,或通過修改與特定的鍵關聯的條目的數據,來改變存儲在Dictionary內的數據。下面的代碼改變鍵爲MyKey的條目中的數據。
ObjMyData.Item(“MyKey”) = “NewValue” ‘ In VBScript
ObjMyData.Item(‘MyKey’) = ‘NewValue’; // In JScript
如果指定的鍵在Dictionary未找到,將在Dictionary中後面位置創建一個以MyKey爲鍵,以New Value爲其條目值的新的鍵/條目對。有意思的是,如果使用一個不存在的鍵來檢索條目,不僅得到一個空的字符串(這是可以想到的),而且還在Dictionary裏添加一個新的鍵/條目對,鍵即是指定的鍵,但條目的數據爲空。
可以使用Key屬性僅改變鍵名的值而不改變與之對應的條目的數據。將一個已存在的鍵MyKey改變爲MyNewKey,可以用:
objMyData.Key(“MyKey”) = “MyNewValue” ‘ In VBScript
objMyData.Item(‘MyKey’) = ‘MyNewValue’; // In JScript
如果指定的鍵未找到,則產生運行期錯誤。
4. 設置比較模式
Dictionary的CompareMode屬性僅適用於VBScript,不能在JScript中使用。當比較字符串鍵時,允許指定比較的方式。兩個允許的值爲BinaryCompare(0)和TextCompare(1)。BinaryCompare(0)爲二進制數對照(即區分大小寫);TextCompare(1)爲文本對照(即不區分大小寫)。
5. 遍歷Dictionary
研究Dictionary時,有兩個方法和一個屬性需要特別注意,它們允許我們遍歷存儲在Dictionary裏的所有鍵/條目對。Items方法用一個一維數組的形式返回Dictionary裏所有的條目數據,而keys方法用一個一維數組返回所有已存在的鍵值。可以使用Count屬性得到鍵或條目的數量
例如,可以使用下列代碼得到名稱爲objMyData的Dictionary中所有的鍵和條目值。注意,雖然Count屬性保存了在Dictionary裏的鍵/條目數量,但VBScript和JScript的數組總是從下標0開始的。因此,數組下標應從0到Count-1。
‘In VBScript:
arrKeys = objMyData.Keys ‘Get all the keys into an array
arrItems = objMyData.Items ‘Get all the items into an array


For intLoop = 0 To objMyData.Count –1 ‘Iterate through the array
      StrThisKey = arrKeys(intLoop) ‘This is the key value
      StrThisItem = arrItems(intLoop) ‘This is the item (data) value
Next


// In JScript
// Get VB-style arrays using the Keys() and Items() methods
var arrKeys = new VBArray(objMyData.Keys()).toArray();
var arrItems = new VBArray(objMyData.Items()).toArray();

for (intLoop = 0; intLoop < objMyData.Count; intLoop++) {
// Iterate through the arrays
strThisKey = arrKeys[intLoop]; // This is the key value
strThisItem = arrItems[intLoop]; // This is the item (data) value
}
在VBScript裏也可以使用For Each … Next語句完成同樣的功能:
arrKeys = objMyData.Keys
arrItems = objMyData.Items

For Each objItem in arrItems
       Response.Write objItem & “ = “ & arrItems(objItem) & “<BR>”
Next

5.3.2 Dictionary對象示例
本書提供了一系列示例文件可用來試驗腳本運行時間庫的各種屬性。
本章代碼的缺省頁面提供了一系列可使用的VBScript示例鏈接。有些示例對JScript同樣有效。這些示例存放在Chapter05目錄下相應的子目錄裏,顯示的界面如圖5-2所示:

要查看Dictionary對象的運行,在菜單頁面點擊第一個鏈接,打開名叫show_dictionary.asp的頁面。這個頁面顯示了我們提供的Dictionary對象的內容,允許試驗其屬性和方法。屏幕如圖5-3所示:

1. Dictionary的global.asa文件
隨Dictionary對象示例頁面提供的文件之一是global.asa。它創建並預先填充了一個會話層作用域的Dictionary對象,因此其內容在頁面請求之間不會丟失。一般說來(考慮到可擴展性),這不是一個理想的做法。在這個例子裏,可以看到Dictionary的屬性和方法的效果。
如果在自己的服務器上下載並安裝示例,必須創建一個基於此global.asa文件的虛擬應用程序。或者將其內容添加到缺省站點的根文件夾中的global.asa文件裏。在第3章講述瞭如何用嚮導創建虛擬應用程序。然而對於本示例,創建一個虛擬應用程序最簡單的方法是在Chapter05示例文件夾內右擊dictionary子文件夾,在Properties對話框的Home Directory選項卡里,點擊Create按鈕,如圖5-4所示:

在這個global.asa文件裏,代碼使用<OBJECT>元素創建一個會話層作用域的Scripting.Dictionary對象實例。然後在Session_onStart事件處理程序裏將一系列值用Add方法放入Dictionary中,並將對Dictionary對象的引用指定給ASP會話變量MyDictionary:
<OBJECT ID="objBookList" RUNAT="SERVER" SCOPE="SESSION"
PROGID="Scripting.Dictionary">
</OBJECT>

<SCRIPT LANGUAGE="VBScript" RUNAT="SERVER">

Sub Session_onStart()
objBookList.Add "2610", "Professional Active Server Pages 3.0"
objBookList.Add "1274", "Instant JavaScript"
objBookList.Add "2882", "Beginning ASP Components"
objBookList.Add "1797", "Professional ASP Techniques"
objBookList.Add "1835", "AD0 2.0 Programmer's Reference"
Set Session("MyDictionary") = objBookList
End Sub

</SCRIPT>
2. Dictionary示例頁面
在“Scripting.Dictionary Object”主頁面裏,首要的任務是得到一個會話層作用域的Dictionary對象實例的引用。注意,這個引用是一個對象變量,因此必須在VBScript裏使用Set關鍵字。
然後,檢查一下是否得到了一個對象(這是個好習慣),如果沒有正確地建立包含global.asa文件的虛擬應用程序,檢查一下問題出在哪裏。你將看到我們自己的消息代替了ASP的錯誤消息(但是注意,對於這一操作必須關閉缺省的錯誤處理)。
<%

on error resume next ' turn off error handling to test if object exists

'retrieve Dictionary object from user's session
Set objMyData = Session("MyDictionary")

If IsObject(objMyData) Then 'found Dictionary object in Session

%>

<P><DIV CLASS="subhead">Iterating the Dictionary with Arrays</DIV>
<%
arrKeysArray = objMyData.Keys 'get all the keys into an array
arrItemsArray = objMyData.Items 'get all the items into an array
For intLoop = 0 To objMyData.Count - 1 'iterate through the array
Response.Write "Key: <B>" & arrKeysArray(intLoop) & "</B> Value: <B>" _
& arrItemsArray(intLoop)& "</B><BR>"
Next
%>

… Other code and controls go here …

<%
Else

'could not find Dictionary object in the session
Response.Write "Dictionary object not available in global.asa for session"

End If
%>
顯示在頁面上的Dictionary內容列表是使用Dictionary對象的Key和Items方法創建的兩個數組,可使用前面的代碼遍歷它們。
3. Dictionary頁面控件
在Dictionary的內容列表下是一系列的HTML控件,可用於設定Dictionary對象的某些屬性和執行各種方法。這些控件全部在一個<FORM>內,其ACTION屬性值是本頁面,所以窗體的內容提交回本頁面。在前面的章節的示例裏使用了同樣的技術。
在<FORM>段中,改變屬性或執行一個方法是通過一個按鈕(沒有標題)實現的。用於屬性和方法的值放入按鈕旁的文本框或列表框中。
該頁的第一個按鈕用於設定Dictionary裏的條目的Key屬性。這裏使用了一個下拉列表,可以選擇一個已經存在的Key值。下面的代碼創建了頁面內該部分的控件。爲了填充列表,使用了另外一個遍歷Dictionary對象的技術,即For Each … Next語句。代碼如下:

<FORM ACTION="<% = Request.ServerVariables("SCRIPT_NAME") %>" METHOD="POST">

<P><DIV CLASS="subhead">The Dictionary Properties</DIV>
<INPUT TYPE="SUBMIT" NAME="cmdChangeKey" VALUE=" ">
Dictionary.Key ("
<SELECT NAME="lstChangeKey" SIZE="1">
<%
For Each objItem in objMyData
Response.Write "<OPTION>" & objItem
Next
%>
</SELECT> ") = "
<INPUT TYPE="TEXT" NAME="txtChangeKey" SIZE="15" VALUE="New Key Name"> "
<BR>

… Other controls go here …

</FORM>

4. 使用Dictionary的屬性和方法
在“Scription.Dictionary Object”頁面,點擊用來檢查並改變條目的Key屬性的按鈕,如圖5-5所示:

把窗體再次提交給頁面。該頁面包含一個腳本段,檢查被點擊的按鈕的值。它通過在Resquest.Form集合裏查找按鈕的名字來斷定單擊的是哪個按鈕。如果發現一個對應於cmdChangKey的值,則從列表中或文本框中得到相應的值並用來改變Key屬性:

'look for a command sent from the FORM section buttons
If Len(Request.Form("cmdChangeKey")) Then
strKeyName = Request.Form("lstChangeKey") 'Existing key from list box
strNewKey = Request.Form("txtChangeKey") 'New key value from text box
objMyData.Key(strKeyName) = strNewKey 'Set key property of this item
End If

頁面重新載入後,在Dictionary的內容列表裏能看到相應的結果,如圖5-6所示:

頁面的其餘代碼用來設定一個條目的Item屬性,或者執行Dictionary對象的方法。下面是這些操作的代碼,每段代碼與演示Key屬性的代碼非常類似。每次都將結果顯示在Dictionary的內容列表中:

If Len(Request.Form("cmdChangeItem")) Then
strKeyName = Request.Form("lstChangeItem") 'Existing key from list box
strNewValue = Request.Form("txtChangeItem") 'New item value from text box
objMyData.Item(strKeyName) = strNewValue 'Set the Item property
End If

If Len(Request.Form("cmdAdd")) Then
strKeyName = Request.Form("txtAddKey") 'New key value from text box
strItemValue = Request.Form("txtAddItem") 'New item value from text box
objMyData.Add strKeyName, strItemValue 'Execute the Add method
End If

If Len(Request.Form("cmdRemove")) Then
strKeyName = Request.Form("lstRemove") 'Existion key from list box
objMyData.Remove strKeyName 'Execute the Remove method
End If

If Len(Request.Form("cmdRemoveAll")) Then
objMyData.RemoveAll 'Execute the RemoveAll method
End If

例如,如果現在點擊Add方法的按鈕,在Dictionary的內容列表裏將增加一個新的條目,如圖5-7所示:

結果如圖5-8所示:

可以在這個頁面中試驗Dictionary對象的屬性和方法,你將會發現什麼因素及在什麼環境下能引起Dictionary對象錯誤。例如,嘗試用與已經存在的一個條目相同的鍵值增加一個條目,看看會出現什麼結果。

關於CompareMode 屬性

描述
設置並返回在 Dictionary 對象中比較字符串關鍵字的比較模式。
語法
object.CompareMode[ = compare]
CompareMode 屬性有以下部分:

部分 描述
object 必選。Dictionary 對象的名稱。
compare 可選。如果提供此參數,compare 參數爲數值,表示由函數如 StrComp 使用的比較模式。


設置
compare 參數設置如下:
Constant      Value    Description
vbBinaryCompare 0      執行二進制比較.
vbTextCompare   1     執行文本比較.


說明
大於 2 的值可用來進行使用國別 Ids 的比較 (LCID)如果試圖更改已經包含數據的 Dictionary 對象的比較模式,則會出現錯誤。
CompareMode 屬性使用與 StrComp 函數中 compare 參數相同的值。


下面例子舉例說明如何使用 CompareMode 屬性:
Dim d          
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare
d.Add "a", "Athens"      '添加一些鍵和項目。
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
d.Add "B", "Baltimore"   '在該行添加方法失敗,因爲'字母 b 已經在 Dictionary 中存在。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章