帰りは気楽な歌で

Windows、VBScript等の小ネタ、その他個人の趣味(音楽等)を書いていきます。

Dictionary オブジェクトの並び順

仕事でVBAVBScriptを書くことが多いが、良く使っているオブジェクトの一つがScripting.Dictionary。

気になったのが、Dictionaryオブジェクトから値を取り出す順番。

Dictionaryオブジェクト自身は、この(http://www.atmarkit.co.jp/ait/articles/0907/29/news113_2.html)ページによると、

キーの格納順序については保証されない。例えば要素を列挙した際、最後に追加した要素が最後に現れるかどうかは分からない

とのこと。しかし、実際に下記のようなソースを実行すると、1~100まで格納した順に値が取り出される。

Option Explicit

Dim objDic
Set objDic = WScript.CreateObject("Scripting.Dictionary")

Dim i
For i = 1 to 100
    objDic.Add i, "値:" & i
Next

Dim key
For each key In objDic.Keys
    WScript.echo objDic(key)
Next

実はMicrosoftのサイトでこんな記述を発見した。

Sorting a Scripting Dictionary Populated with String Data

DictionaryオブジェクトがSortメソッドを実装していないので、ソート方法を紹介しているページなのだが、そこには、

Because this information is stored unsorted, enumerating through the array returns information in the order it was stored.  

 と書かれている。要は

Dictionaryオブジェクトは値をソートしないで格納し、取り出す時は"値を追加した順番で取り出される" (ので、ソートする方法を紹介しようとおもったよー)

 という事らしい。なんだって?値を追加した順番?

つまり、追加するだけで、Remove等を行わなければ、キュー(先入れ先出し)みたいな使い方もできるというわけか。

本ブログに記載のソースコード・情報を利用した際に生じたいかなる損害において、筆者は責任を負いません。十分な知識を持ったうえでご利用ください。