|
.NET TIPS ハッシュテーブル(連想配列)を使うには?(Dictionaryクラス編)[2.0のみ、C#、VB]デジタルアドバンテージ 遠藤 孝信2006/03/31 |
![]() |
|
|
|
| 本稿は「TIPS:ハッシュテーブル(連想配列)を使うには?」に加筆・修正を行い、.NET Framework 2.0に対応させた改訂版です。 |
ハッシュテーブルとは、キー(key)と値(value)のペアを保持しているコレクションである。通常の配列やリストがインデックス番号により各値(各要素)にアクセスできるのに比べて、ハッシュテーブルでは、インデックス番号の代わりにキーを用いて、その各値にアクセスすることができる。キーと、そのキーから連想される(キーに対応付けられている)値のペアを保持しているため、ハッシュテーブルは「連想配列」とも呼ばれる。ハッシュテーブルの特長は、指定したキーから、それに対応した値を高速に得られることである。
.NET Framework 1.xのクラス・ライブラリでは、ハッシュテーブルはHashtableクラス(System.Collections名前空間)で実装されていたが、.NET Framework 2.0ではDictionaryジェネリック・クラス(System.Collections.Generic名前空間)が追加され、より効率的かつ安全にハッシュテーブルを扱えるようになっている。本稿では、このDictionaryジェネリック・クラスの基本的な利用方法についてまとめる。
ハッシュテーブルのインスタンス作成
Dictionaryジェネリック・クラスは、コレクションの要素となるキーと値の型を型パラメータにより指定してインスタンスを作成する。以下は、キーも値も文字列の場合の記述例だ。
| ||
| Dictionaryジェネリック・クラスのインスタンス生成(上:C#、下:VB) |
この場合には、以降のハッシュテーブル(この例ではdict)への操作で、文字列でないキーや値を扱うコードはコンパイル・エラーとなる。
ハッシュテーブルへの項目の追加
ハッシュテーブルへの項目(キーと値のペア)の追加は、インデクサ(VBの場合は既定のプロパティとなっているItemプロパティ)か、Addメソッドにより行う。
| ||
| ハッシュテーブルへの項目の追加(上:C#、下:VB) |
指定したキーがハッシュテーブルに存在しない場合には、新しい要素として登録される。キーがすでに存在する場合には、インデクサではそのキーに対応する値が置き換えられるが、Addメソッドでは例外が発生する。
ハッシュテーブル内の値の取得
ハッシュテーブル内のあるキーに対する値の取得は、上記と同様にインデクサによりキーを指定して行う(逆に、値からキーを直接取得することはできない)。Hashtableクラスでは取り出した値はObject型となるため通常はキャストが必要となるが、Dictionaryジェネリック・クラスではキャストは不要だ。
| ||
| ハッシュテーブル内の値の取得(上:C#、下:VB) |
また、Hashtableクラスでは、指定したキーがハッシュテーブルに存在しない場合にはnull(VBではNothing)が返されるが、Dictionaryジェネリック・クラスでは例外が発生する。
このため、指定したキーが存在するかどうかをチェックし、もし存在すればその値を取得するTryGetValueメソッドがDictionaryジェネリック・クラスには追加されている(記述例は下のサンプル・プログラムを参照)。
すべてのキーや値の列挙
ハッシュテーブルに格納されているすべてのキーあるいは値は、コレクションとしてKeysプロパティあるいはValuesプロパティから取得できる。このため、foreachステートメント(VBではFor Each...Next)などを使って、すべてのキーや値を列挙することができる(記述例は下のサンプル・プログラムを参照)。
キーや値の存在チェック
特定のキーや値を持つ項目がハッシュテーブルに格納されているかどうかを調べるには、ContainsKeyメソッドあるいはContainsValueメソッドを使用する。この2つのメソッドはbool型(VBではBoolean型)の値(TrueかFalse)を返す(記述例は下のサンプル・プログラムを参照)。
個々の要素の列挙
ハッシュテーブル内の要素を列挙する場合には、各要素はKeyValuePairジェネリック構造体(System.Collections.Generic名前空間)のオブジェクトとして扱われる。この構造体は2つの型パラメータを持つが、それらはDictionaryジェネリック・クラスのインスタンス作成時に指定したものと同一となる。そして、KeyValuePairジェネリック構造体のオブジェクトからは、KeyおよびValueプロパティによりキーと値を取得できる(記述例は下のサンプル・プログラムを参照)。
なお通常の配列などと異なり、ハッシュテーブルでは格納した要素の順序は保持されない。このためキーや値や要素を列挙した場合に、どのような順で要素が取り出されるかは不定である。
ハッシュテーブルを使ったサンプル・プログラム
ここまでの解説をまとめたサンプル・プログラムを以下に示す。
| |
| ハッシュテーブルを使用したC#のサンプル・プログラム(dictionary.cs) | |
| |
| ハッシュテーブルを使用したVBのサンプル・プログラム(dictionary.vb) | |
ちなみに.NET Framework 2.0のクラス・ライブラリには、キーによりコレクションの要素が自動的に並べ替えられるSortedDictionaryジェネリック・クラス(System.Collections.Generic名前空間)も用意されている。
上記のサンプル・プログラムの最後の部分では、すでに存在するハッシュテーブルを基にこのクラスのインスタンスを作成し、その全要素を列挙している。その出力例から各項目はキーによりソートされているのが分かる。![]()
| 利用可能バージョン:.NET Framework 2.0のみ カテゴリ:クラス・ライブラリ 処理対象:コレクション 使用ライブラリ:Dictionaryクラス(System.Collections.Generic名前空間) 使用ライブラリ:KeyValuePair構造体(System.Collections.Generic名前空間) 使用ライブラリ:SortedDictionaryクラス(System.Collections.Generic名前空間) 関連TIPS:ハッシュテーブル(連想配列)を使うには? |
|
||||||||||||||||||||||||||||
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


