プログラミングを行っていく中で、何かしらの目印と値を同時に持ちたいという場合がよくあります。例えば学校のクラスでいうと「出席番号(学籍番号)」と「名前」のようなものです。C#ではそのような目印と値をセットにして保有できる機能として「Dictionary」が用意されています。
Dictionaryを知っておくことで、「出席番号(学籍番号)」と「名前」で値を定義できる構造体を簡単に作成できます。Dictionaryは知っておくと随所で便利に使えるので知っておきましょう。
C#のDictionaryとは
Dictionaryは、キーと値のペアを格納するデータ構造です。キーと値は1対1の関係であり、キーを使用して値を取得できます。つまり、Dictionaryはキーに基づいて値を検索することができます。これは、辞書と同じような構造を持っているため、”Dictionary”という名前が付いています。
Microsoftの公式ドキュメントでは、Dictionaryは以下のように定義されています。
キーと値のコレクションを表します。
Dictionary | Microsoft Docs
例えば、電話帳を考えてみましょう。各人の名前(キー)に対応する電話番号(値)があります。電話帳のように、名前を知っていれば関連する電話番号をすぐに見つけることができます。これがDictionaryの基本的な考え方です。
C#でのDictionaryの使い方
C#でDictionaryを使用するには、System.Collections.Generic名前空間を使用する必要があります。以下は、Dictionaryを宣言して初期化する方法です。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// Dictionaryの宣言と初期化
Dictionary<string, int> ages = new Dictionary<string, int>();
// 追加
ages.Add("John", 30);
ages.Add("Alice", 25);
ages.Add("Bob", 35);
// 取得
int johnsAge = ages["John"];
Console.WriteLine("John's age is " + johnsAge); // 出力: John's age is 30
// 削除
ages.Remove("Alice");
}
}
この例では、文字列型のキーと整数型の値を持つDictionaryを作成しています。そして、”John”、”Alice”、”Bob”という名前にそれぞれ対応する年齢を追加しています。また、”John”の年齢を取得し、”Alice”のエントリを削除しています。
Dictionaryを操作する方法・メソッド
Dictionaryでは、キーを使用して値を追加、取得、削除することができます。よく使用される操作をサンプルコード付きで解説します。
値を追加する方法
新しいキーと値のペアを追加するには、Add メソッドを使用します。以下のように、インスタンス化された Dctionary に対して、キーと値を指定して新しいエントリを追加します。
ages.Add("John", 30);
値を取得する方法
指定したキーに対応する値を取得するには、キーをインデックスとして使用します。存在しないキーを指定すると、例外が発生するため、事前に ContainsKey メソッドを使用して存在を確認することが推奨されます。
int johnsAge = ages["John"];
値を削除する方法
指定したキーとそれに対応する値を削除するには Remove メソッドを使用します。指定したキーが存在しない場合、このメソッドは何もしません。Remove メソッドの中には Key を渡す必要があります。
ages.Remove("Alice");
Dictionaryを使うときの注意点
Dictionaryはハッシュテーブルに基づいて実装されています。そのため、キーは一意でなければなりません。同じキーを使用して複数の値を追加しようとすると例外が発生するので注意が必要です。
また、Dictionaryは順序付けられていません。つまり、要素が追加された順序で保持されるわけではありません。キーに基づいてデータが管理されるため、順序は保証されません。なぜ順序が保持されていないかというと、Dictionaryはハッシュテーブルに基づいて実装されているからです。
ハッシュテーブルは、キーからハッシュ値を計算し、そのハッシュ値に基づいてデータを格納するための配列のインデックスを決定します。そのため、キーのハッシュ値に基づいて要素が配置されるため、要素の追加順序や格納順序が保持されるわけではありません。
例えば、Dictionaryに要素を追加した順序が”A”、”B”、”C”だったとしても、それらの要素が実際に格納される順序は、ハッシュ値に基づいて決定されます。そのため、”A”、”C”、”B”のようになる可能性があります。こうしたデータの格納方法は、データの挿入や検索において高速で効率的な操作を提供を実現するために用いられています。
Dictionaryはキーに基づいて効率的な検索操作を提供することが主な目的です。そのため要素の格納順序を保証することを考えないデータの持ち方になります。順序を重視する場合には、Dictionaryではなく、順序付きコレクション(例えば、ListやLinkedList)を検討しましょう。
まとめ
DictionaryはC#でよく使用される便利なデータ構造であり、キーと値のペアを効率的に管理することができるため非常に便利なデータ構造体です。Dictionaryの基本的な概念と使い方について紹介しました。C#を学ぶ上で、Dictionaryは高速なデータ検索を提供してくれる非常に便利なツールであるため覚えておくと便利です。