ここでは非ジェネリックなコレクション型System.Collections.Hashtableクラスについて解説します。 Hashtableクラスを使用するよりも、Hashtableに相当するジェネリックなコレクション型System.Collections.Generic.Dictionary<TKey, TValue>クラスを使用することを強く推奨します。
Hashtable
System.Collections.HashtableクラスはPerlやJavaScriptなどの言語で連想配列と呼ばれるものに相当します。 コレクション内の要素数を動的に増減できる点はArrayListと同じですが、キーと値を対(ペア)で登録することで、インデックスではなくキーによってコレクション内の要素にアクセスする点でArrayListとは異なります。 Hashtableでは、任意のobject(厳密にはGetHashCodeメソッドが一意なハッシュ値を返すオブジェクト)をキーとして指定することができます。
基本的な操作
Hashtableを使った例によって基本的な操作について見ていきます。
この例ではキーとして文字列、値として数値を使ってHashtableを操作しています。 Hashtable内の要素を取得・設定するには、インデクサにキーを指定します。 設定の際、キーに該当するの要素が無ければ、追加されます。 取得の際、キーに該当する要素がない場合は、null(Nothing)が返されます(IndexOutOfRangeExceptionがスローされることはありません)。 また、ArrayList同様、Add, Remove, Clearなどのメソッドによってキーと値の対を追加、削除、クリアすることも出来ます。
列挙操作
Hashtableの場合も、foreach文によって要素を列挙することができますが、ArrayListなどとは異なり常にキーと値のペアが列挙されます。 Hashtableの内部では個々のペアはDictionaryEntry構造体として格納されるので、foreach文ではDictionaryEntry構造体を使います。 DictionaryEntry構造体のKeyプロパティとValueプロパティを参照することで、キーと値を参照できます。 列挙の際、必ずしも追加した順で列挙されるとは限らない点に注意が必要です。
また、Hashtableに格納されているすべてのキーはKeysプロパティ、値はValuesプロパティを通して参照できます。
追加した順序を維持した状態で列挙したい場合はOrderedDictionaryクラスを使うことができます。
配列へのコピー
列挙の場合と同様、CopyToメソッドでHashtableの内容を配列にコピーする場合も、DictionaryEntry構造体としてコピーされます。 キーのみをコピーしたい場合はKeysプロパティのCopyTo、値のみをコピーしたい場合はValuesプロパティのCopyToメソッドを使う必要があります。 当然ながら、キー・値の型とコピー先配列の型が合わない場合はInvalidCastExceptionがスローされます。
ContainsKey, ContainsValue
Hashtableに指定したキーを持つ要素が格納されているかどうかを調べるにはContainsKeyメソッド、値が格納されているか調べるにはContainsValueメソッドを使います。
なお、IDictionaryインターフェイスのメソッドを実装したContainsメソッドも用意されていますが、これとContainsKeyの動作は全く同じです。
キー比較のカスタマイズ
コンストラクタで適切なIEqualityComparerインターフェイスを指定することで、Hashtableのキー比較時の動作をカスタマイズ出来ます。 例えば、文字列をキーとした場合に大文字小文字を無視するようにするといったことが出来ます。 以下は、StringComparerクラスを使って、大文字小文字を無視するHashtableを作成する例です。