2016/04/13

[C#]DataTableからDictionaryを作る

このエントリーをはてなブックマークに追加
DataTableからDictionaryに変換する方法です。

DataTableからDictionaryに変換

Dictionaryは連想配列と呼ばれるように、キーを指定すると、対応する値を返してくれるデータ構造です。
配列を一つ一つ照合するのではなく、ハッシュテーブルという構造によって、効率よく値を引っ張ってきてくれます。
データサイズが大きく、繰り返し利用するものほど、この恩恵によるメリットが大きくなるでしょう。

また、DataTableは、DBとの親和性も高いので、大きいサイズを取り扱うことが多くなります。
任意の行を拾うのに、DataViewのRowFilterメソッドを使う方法もありますが、やや複雑ですし、ものによっては大げさになりがちです。

さくっと、値だけを拾ってきたいというときに、Dictionaryに変換しておく方法を知っておくと何かと便利です。

ソースコード
// ダミーのDataTableを作成します
DataTable table = new DataTable();
table.Columns.Add("name");
table.Columns.Add("mail");
table.Columns.Add("sex");
table.Columns.Add("age");

table.Rows.Add("杉浦 光", "sugiura_hikaru@example.com", "女", "42");
table.Rows.Add("戸塚 人志", "toduka_hitoshi@example.com", "男", "72");
table.Rows.Add("熊井 知史", "kumai_tomofumi@example.com", "男", "24");
table.Rows.Add("高木 朝陽", "takagi_asahi@example.com", "女", "44");
table.Rows.Add("平田 ちえみ", "hirata_chiemi@example.com", "女", "39");
table.Rows.Add("溝口 隆博", "mizoguchi_takahiro@example.com", "男", "50");
table.Rows.Add("椎名 長利", "shiina_nagatoshi@example.com", "男", "30");
table.Rows.Add("谷 フミヤ", "tani_fumiya@example.com", "男", "27");
table.Rows.Add("黒崎 勝久", "kurosaki_katsuhisa@example.com", "男", "69");
table.Rows.Add("浦野 真一", "urano_shinichi@example.com", "男", "54");

// DataTableをDictionaryに変換します
var dictionary = table.AsEnumerable()
    .ToDictionary(
        row => Convert.ToString(row["name"]), 
        row => Convert.ToString(row["mail"])
    );

Console.WriteLine(dictionary["溝口 隆博"]);
// ●出力結果
// mizoguchi_takahiro@example.com
長いですが、ほとんどはサンプルのためのTableを生成しているだけで、変換してるところは一行です。
var dictionary = table.AsEnumerable()
    .ToDictionary(
        row => Convert.ToString(row["name"]), 
        row => Convert.ToString(row["mail"])
    );
  • TableクラスのAsEnumerableメソッドでLinQを使えるようにします。
  • ToDictionaryで、Dictionary化させます。
  • キーと対応する値を指定します。ここではnameをキーに、mailを値に設定しています。

抽出して変換

AsEnumerableメソッド以降はLINQが使えますので、必要な条件を満たすアイテムのみを抽出することもできます。
ソースコード
// 条件を指定して変換(女性のみ抽出)
var dictionaryWomanOnly = table.AsEnumerable()
    .Where(row => Convert.ToString(row["sex"]) == "女")
    .ToDictionary(
        row => Convert.ToString(row["name"]),
        row => Convert.ToString(row["mail"])
    );

Console.WriteLine(dictionaryWomanOnly.Count());
// ●出力結果
// 3

Transform a DataTable into Dictionary C#
http://stackoverflow.com/questions/19712958/transform-a-datatable-into-dictionary-c-sharp


0 件のコメント :

コメントを投稿