Dictionary<TKey,TValue>を利用して Key-Valueデータを扱う - C#

Dictionaryクラスを使ってKey-Valueデータを扱うコードを紹介します。

概要

C#でkeyに対応した値(value)を管理する際にはDictionaryクラスを利用できます。 この記事ではDictionaryクラスを利用してデータの格納や取り出しをするコードを紹介します。

実装例:値の追加と取得

Dictionaryクラスのインスタンスを作成し、キーと値を挿入するプログラムです。
Windowsフォームアプリケーションを作成します。

UI

下図のフォームを作成します。

コード

以下のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DictionaryDemo
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      Dictionary<string, int> data = new Dictionary<string, int>();
      
      data.Add("index.html", 100);
      data.Add("product.html", 34);
      data.Add("news.html", 58);
      data.Add("contact.html", 27);
      data.Add("download.html", 48);

      int value = data["news.html"];
      textBox1.Text += Convert.ToString(value)+"\r\n";
    }
  }
}

解説

下記コードにてDictionaryクラスを宣言します。Typeの最初の要素がキーに、2番目の要素が値になります。上記のコードではstring型のキーでint型の値を持ちます。
Dictionary<string, int> data = new Dictionary<string, int>();

Add()メソッドを呼び出してKey-Valueデータを追加します。
  data.Add("index.html", 100);
  data.Add("product.html", 34);
  data.Add("news.html", 58);
  data.Add("contact.html", 27);
  data.Add("download.html", 48);

キーを指定してキーの値を取り出します。上記のコードでは"news.html"のキーの値を取得します。(58が取得されます。)
  int value = data["news.html"];

取得した値をテキストボックスに表示します。
  textBox1.Text += Convert.ToString(value)+"\r\n";

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。

[button1]のボタンをクリックします。"news.html”の値の58がテキストボックスに表示されます。

存在しないキーへの対処

以下のコードを実行すると存在しないキーを指定して値を取り出すことになり、KeyNotFoundException 例外が発生します。
    private void button3_Click(object sender, EventArgs e)
    {
      Dictionary<string, int> data = new Dictionary<string, int>();

      data.Add("index.html", 100);
      data.Add("product.html", 34);
      data.Add("news.html", 58);
      data.Add("contact.html", 27);
      data.Add("download.html", 48);

      int value = data["mail.html"];
    }


例外を発生させないための対策として、ContainsKeyメソッドを呼び出してキーが含まれるかを判定してから値を取り出します。
ContainsKeyメソッドでキーを確認する例
    private void button4_Click(object sender, EventArgs e)
    {
      Dictionary<string, int> data = new Dictionary<string, int>();

      data.Add("index.html", 100);
      data.Add("product.html", 34);
      data.Add("news.html", 58);
      data.Add("contact.html", 27);
      data.Add("download.html", 48);

      if (data.ContainsKey("mail.htm") == true) {
        int value = data["mail.html"];
        textBox1.Text += Convert.ToString(value) + "\r\n";
      }
    }

または、TryGetValue()メソッドを用います。
TryGetValueメソッドを利用する例
    private void button5_Click(object sender, EventArgs e)
    {
      Dictionary<string, int> data = new Dictionary<string, int>();

      data.Add("index.html", 100);
      data.Add("product.html", 34);
      data.Add("news.html", 58);
      data.Add("contact.html", 27);
      data.Add("download.html", 48);

      int value;
      if (data.TryGetValue("news.html", out value) == true) {
        textBox1.Text += Convert.ToString(value) + "\r\n";
      }
    }

Dictionaryクラスへの値の追加

DictionaryクラスへのKey-Valueデータの追加はAddメソッド以外にも、以下の配列の書式でも追加できます。
    private void button6_Click(object sender, EventArgs e)
    {
      Dictionary<string, int> data = new Dictionary<string, int>();

      data["index.html"]=100;
      data["product.html"]=34;
      data["news.html"]=58;
      data["contact.html"]=27;
      data["download.html"]=48;

      int value = data["news.html"];
      textBox1.Text += Convert.ToString(value) + "\r\n";
    }

Key Valueの列挙

以下のコードはDictionaryクラスに追加されている、すべての値、キーを列挙します。
    private void button7_Click(object sender, EventArgs e)
    {
      Dictionary<string, int> data = new Dictionary<string, int>();

      data.Add("index.html", 100);
      data.Add("product.html", 34);
      data.Add("news.html", 58);
      data.Add("contact.html", 27);
      data.Add("download.html", 48);
      //
      foreach (string key in data.Keys) {
        textBox1.Text += string.Format("{0:s}:{1:d}\r\n", key, data[key]);
      }
      //
      foreach (int v in data.Values) {
        textBox1.Text += string.Format("{0:d}\r\n", v);
      }
      //
    }

KeyValuePairを用いるとキーと値を同時に取得できます。
    private void button8_Click(object sender, EventArgs e)
    {
      Dictionary<string, int> data = new Dictionary<string, int>();

      data.Add("index.html", 100);
      data.Add("product.html", 34);
      data.Add("news.html", 58);
      data.Add("contact.html", 27);
      data.Add("download.html", 48);

      foreach (KeyValuePair<string, int> kvp in data) {
        textBox1.Text += string.Format("{0:s}:{1:d}\r\n", kvp.Key, kvp.Value);
      }

    }

SortedDictionaryを用いたキーのソート

SortedDictionaryを用いるとキーの値でソートできます。
    private void button9_Click(object sender, EventArgs e)
    {
      Dictionary<string, int> data = new Dictionary<string, int>();

      data.Add("index.html", 100);
      data.Add("product.html", 34);
      data.Add("news.html", 58);
      data.Add("contact.html", 27);
      data.Add("download.html", 48);

      SortedDictionary<string, int> sdata = new SortedDictionary<string, int>(data);
      foreach (KeyValuePair<string, int> kvp in sdata) {
        textBox1.Text += string.Format("{0:s}:{1:d}\r\n", kvp.Key, kvp.Value);
      }
 
    }

実行結果



このページのキーワード
  • C#
  • Dictionary
  • Key-Valueデータ
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2011-06-30
iPentec all rights reserverd.