1ヶ月でWebデザイン・プログラミングスキルをオーダーメイドのカリキュラムで学べるスクール、それがWebCamp。

子供の想像力を伸ばしアイデアを形にする小学生向けプログラミング教室「プロスタキッズ」

【C#入門】連想配列を扱う

Pocket

【C#】連想配列Dictionaryを使う

(画像1を使用)

連想配列とは?

キーと値をペアとして保持するコレクション
連想配列とはキー(key)と値(value)をペアとして保持するコレクションです。名前に「連想」と付いていますが、通常の配列との違いは、通常の配列がインデックス(添字)を使って要素を参照するのに対し、連想配列ではキーを指定して値を参照します。

(画像2を使用)

上の例では、”a”と”ビール”、”b”と”日本酒”、”c”と”ワイン”がキーと値の関係になります。”a”というキーを指定すると、対になる”ビール”という値が返ってきます。キーから連想される値が返ってくるので、連想配列と呼ばれます。

キーはユニークな値を指定する
キーにはユニークな値を設定するようにします。ユニークとは日本語でいうと、一意ともいいます。Dictionaryクラスでは、キーは必ず重複していないキーを設定します。上の例だと、”b”という文字列がキーですが、他に”b”というキーが存在していてはいけません。同じキーを設定しようとするとエラーになります。

C#にはHashtableクラスもある
連想配列はハッシュテーブルとも呼ばれます。C#では、Hashtableクラスが実装されていますが、.NET Framework2.0から、Dictionaryクラス(System.Collections.Generic)が追加されました。前者を使う理由が特にないときは、後者を使うようにします。

連想配列のコーディング
簡単な実装例を見てみましょう。

//宣言
Dictionary dic = new Dictionary();

//キーと値を追加
dic.Add(“a”, “ビール”);
dic.Add(“b”, “日本酒”);
dic.Add(“c”, “ワイン”);

//キーを基に値を参照して出力
Console.WriteLine( dic[“b”]);

Dictionaryクラスを宣言する
Dictionaryクラスを使うには、まず次の書式にしたがって宣言をします。

Dictionary<キーにする型名,値にする型名> 変数名
= new Dictionary<キーにする型名,値にする型名>();

クラスの後に<>括弧が付いていますが、これはジェネリックというC#の機能です。この括弧の中には、キーの型名と値の型名を指定します。例えばキーが文字列型ならstringを、整数型ならintを指定します。

キーと値を追加する
C#でDictionaryにキーと値を追加する方法は2種類あります。結果は同じですが、重複したキーを登録しようとした時に、挙動が異なります。

・Addメソッドを使う
キーと値を引数としてAddメソッドで追加を行います。

dict.Add(“apple”,”りんご”);

この例では、”apple”がキーとなり、”りんご”となります。Addメソッドの引数は、宣言を行なったときの型を指定します。

・通常の配列のように追加する
通常の配列のようにキーと値を追加するには次のように書きます。

dict[“apple”] = “りんご”;

どちらの方法でもキーと値の追加が可能ですが、既にあるキーを指定すると前者はエラーになり、後者は上書きされます。キーの重複が予想されるときでAddメソッドを使う際は、if文でキーが既に追加されていないか確認して、必要に応じて削除・追加をする必要があります。

if (dic.ContainsKey(“b”))
{
dic.Remove(“b”);
dic.Add(“b”, “カクテル”);
}

同一キーが既に含まれているかをbool値で返すContainsKeyメソッドと、引数で指定したキーを削除するRemoveメソッドを使用しています。ただ、Removeメソッドは存在しないキーを引数に指定してもエラーにはなりません。必ずキーを書き換える上の処理では、ContainsKeyメソッドはなくても同じ処理になります。

値を参照する

string str = dic[“b”];

値を参照するには、上のように記述します。Dictionaryクラスはジェネリッククラスなので、取り出す際にキャストが必要ありません。初期化の際に型指定をすることで取り出される値も指定された型で取り出されます。キーを指定して取得しますが、キーが存在しなければ例外が発生します。上の例では、”日本酒”という文字列を参照できます。

Dictionaryクラスを使うメリット
データを重複なく管理できる
Dictionaryクラスを使うと、キーを基にデータを重複なく管理できます。二次元配列ではキーに相当する部分の重複を管理するコードを作らないと、いくつでもデータを追加できてしまいます。 Dictionaryクラスではその手間が省けるわけです。
しかし、これはDictionaryクラスを使う上で注意点にもなります。例えば、ある学校で生徒の氏名をキーにしたとします。キーは必ずユニークなものを使うという原則があるので、これでは同姓同名に対応できません。同じ学校に2人の山田美香さんがいたら、システムが動かなくなってしまいます。こうした事態を避けるために、通常は学生番号をつけて、学生番号をキーにするなどの対策を施します。

配列よりも処理が高速
配列から要素を取り出す時に、for文を使ってキーを検索して、ヒットしたインデックスの要素を取り出すという処理がよくあります。この処理は要素数が増えると処理が遅くなります。同様の処理ならば、Dictionaryクラスを使ったほうが効率的です。

投稿者:プロスタ編集部

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

初心者がプログラミングで挫折しない学習方法を無料動画で公開中。オンラインに特化したプログラミングスクール「TechAcademy(テックアカデミー)」が解説。

この記事が気に入ったら
いいね!しよう

プロスタの最新情報をお届けします

あわせて読みたい

関連記事

ページ上部へ戻る