Dictionary<TKey,T>型をList<T>型に変換する

Dictionary<TKey,T>型をList<T>型に変換するコードを紹介します。

概要

Dictionaryオブジェクトに格納されている値やキーをListオブジェクトに変換したい場合があります。この記事では、DictionaryオブジェクトをListオブジェクトに変換するコードを紹介します。

手順

次の2つの方法があります。

  • Listオブジェクトのコンストラクタを利用する
  • Dictionary.Values / Dictionary.Keys オブジェクトの ToList() メソッドを利用する

Listオブジェクトのコンストラクタを利用する方法

UI

下図のフォームを作成します。テキストボックスとボタンを配置します。
Dictionary<TKey,T>型をList<T>型に変換する:画像1

コード

下記のコードを記述します。button1のClickイベントを実装しています。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DictionaryEnumerate
{
  public partial class FormDictionaryToList : Form
  {
    internal class MyItem
    {
      public int id;
      public string name = "";
      public int price;
    }

    Dictionary<int, MyItem> Items;

    public FormDictionaryToList()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      Items = new Dictionary<int, MyItem>();

      MyItem mi;
      mi = new MyItem() { id = 8, name = "ぺんぎんクッキー", price = 240 };
      Items.Add(mi.id, mi);
      mi = new MyItem() { id = 4, name = "らくだキャラメル", price = 85 };
      Items.Add(mi.id, mi);
      mi = new MyItem() { id = 2, name = "しろくまアイス", price = 160 };
      Items.Add(mi.id, mi);
      mi = new MyItem() { id = 7, name = "あひるタルト", price = 220 };
      Items.Add(mi.id, mi);
      mi = new MyItem() { id = 1, name = "かるがもカステラ", price = 320 };
      Items.Add(mi.id, mi);

      List<MyItem> itemList = new List<MyItem>(Items.Values);

      foreach (MyItem m in itemList)
      {
        textBox1.Text += String.Format("{0:d} {1} {2:d}\r\n", m.id, m.name, m.price);
      }

    }
  }
}

解説

Dictionary オブジェクトの定義部分です。今回の例では、Dictionaryオブジェクトの値には MyItem クラスを挿入する定義にしています。

    internal class MyItem
    {
      public int id;
      public string name = "";
      public int price;
    }

    Dictionary<int, MyItem> Items;


Dictionaryオブジェクトに値を挿入するコードです。MyItemオブジェクトを複数作成し、データを挿入しています。

      Items = new Dictionary<int, MyItem>();

      MyItem mi;
      mi = new MyItem() { id = 8, name = "ぺんぎんクッキー", price = 240 };
      Items.Add(mi.id, mi);
      mi = new MyItem() { id = 4, name = "らくだキャラメル", price = 85 };
      Items.Add(mi.id, mi);
      mi = new MyItem() { id = 2, name = "しろくまアイス", price = 160 };
      Items.Add(mi.id, mi);
      mi = new MyItem() { id = 7, name = "あひるタルト", price = 220 };
      Items.Add(mi.id, mi);
      mi = new MyItem() { id = 1, name = "かるがもカステラ", price = 320 };
      Items.Add(mi.id, mi);

Listオブジェクトのコンストラクタの第一引数にDictionryオブジェクトのValuesを与えることで、Dictionaryオブジェクトの値をリストに変換できます。

      List<MyItem> itemList = new List<MyItem>(Items.Values);


作成したListオブジェクトの要素をforeachループで取得し、テキストボックスに表示します。

      foreach (MyItem m in itemList)
      {
        textBox1.Text += String.Format("{0:d} {1} {2:d}\r\n", m.id, m.name, m.price);
      }

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。
Dictionary<TKey,T>型をList<T>型に変換する:画像2

[button1]ボタンをクリックします。Dictionaryオブジェクトに設定したMyItemオブジェクトの値がテキストボックスに表示されます。
Dictionary<TKey,T>型をList<T>型に変換する:画像3

補足
Dictionaryオブジェクトの値を直接foreachループで取得する場合についてはこちらの記事を参照してください。

ToList()メソッドを利用する方法

ToList()メソッドを利用しても同様の処理が実装できます。

コード

下記コードを記述します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DictionaryEnumerate
{
  public partial class FormDictionaryToList : Form
  {
    internal class MyItem
    {
      public int id;
      public string name = "";
      public int price;
    }

    Dictionary<int, MyItem> Items;

    public FormDictionaryToList()
    {
      InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
      Items = new Dictionary<int, MyItem>();

      MyItem mi;
      mi = new MyItem() { id = 8, name = "ぺんぎんクッキー", price = 240 };
      Items.Add(mi.id, mi);
      mi = new MyItem() { id = 4, name = "らくだキャラメル", price = 85 };
      Items.Add(mi.id, mi);
      mi = new MyItem() { id = 2, name = "しろくまアイス", price = 160 };
      Items.Add(mi.id, mi);
      mi = new MyItem() { id = 7, name = "あひるタルト", price = 220 };
      Items.Add(mi.id, mi);
      mi = new MyItem() { id = 1, name = "かるがもカステラ", price = 320 };
      Items.Add(mi.id, mi);

      List<MyItem> itemList = Items.Values.ToList();

      foreach (MyItem m in itemList)
      {
        textBox1.Text += String.Format("{0:d} {1} {2:d}\r\n", m.id, m.name, m.price);
      }
    }
  }
}

解説

先の例ではListオブジェクトのコンストラクタの引数に、Items.Valuesを与えましたが、こちらの方法では、ToList() メソッドを呼び出して、Listオブジェクトに変換しています。

      List<MyItem> itemList = Items.Values.ToList();

実行結果

実行結果は先の実装例と同じ結果になります。

実用的な例

単純にDictionaryオブジェクトの内容を取得するのみの場合、 こちらの記事で紹介しているforeachループを利用する方法が使えます。 Listオブジェクトに変換する具体的な用途としては、Dictionaryオブジェクトの値を取得してソートして表示する場合があります。 以下では、Dictionayオブジェクトの値をListオブジェクトに変換して、ソートするコードの例を紹介します。

UI

下図のフォームを作成します。ボタンは[button3]のみを利用します。
Dictionary<TKey,T>型をList<T>型に変換する:画像4

コード

下記のコードを記述します。[button3]のClickイベントを実装しています。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DictionaryEnumerate
{
  public partial class FormDictionaryToList : Form
  {
    internal class MyItem
    {
      public int id;
      public string name = "";
      public int price;
    }

    Dictionary<int, MyItem> Items;

    public FormDictionaryToList()
    {
      InitializeComponent();
    }

    private void button3_Click(object sender, EventArgs e)
    {
      Items = new Dictionary<int, MyItem>();

      MyItem mi;
      mi = new MyItem() { id = 8, name = "ぺんぎんクッキー", price = 240 };
      Items.Add(mi.id, mi);
      mi = new MyItem() { id = 4, name = "らくだキャラメル", price = 85 };
      Items.Add(mi.id, mi);
      mi = new MyItem() { id = 2, name = "しろくまアイス", price = 160 };
      Items.Add(mi.id, mi);
      mi = new MyItem() { id = 7, name = "あひるタルト", price = 220 };
      Items.Add(mi.id, mi);
      mi = new MyItem() { id = 1, name = "かるがもカステラ", price = 320 };
      Items.Add(mi.id, mi);

      List<MyItem> itemList = Items.Values.ToList();

      itemList.Sort(Compare);

      foreach (MyItem m in itemList)
      {
        textBox1.Text += String.Format("{0:d} {1} {2:d}\r\n", m.id, m.name, m.price);
      }
    }

    internal static int Compare(MyItem x, MyItem y)
    {
      if (x.id < y.id)
      {
        return -1;
      }
      else if (x.id > y.id)
      {
        return 1;
      }
      else
      {
        return 0;
      }
    }

  }
}

解説

下記のコードでDictionaryオブジェクトを作成し、MyItemクラスのオブジェクトを作成し値を代入し、Dictionaryオブジェクトに挿入しています。

      Items = new Dictionary<int, MyItem>();

      MyItem mi;
      mi = new MyItem() { id = 8, name = "ぺんぎんクッキー", price = 240 };
      Items.Add(mi.id, mi);
      mi = new MyItem() { id = 4, name = "らくだキャラメル", price = 85 };
      Items.Add(mi.id, mi);
      mi = new MyItem() { id = 2, name = "しろくまアイス", price = 160 };
      Items.Add(mi.id, mi);
      mi = new MyItem() { id = 7, name = "あひるタルト", price = 220 };
      Items.Add(mi.id, mi);
      mi = new MyItem() { id = 1, name = "かるがもカステラ", price = 320 };
      Items.Add(mi.id, mi);


DictionryオブジェクトのValuesプロパティのToList()メソッドを呼び出し、Listオブジェクトに変換します。

      List<MyItem> itemList = Items.Values.ToList();


ListオブジェクトのSortメソッドを呼び出し、リストをソートします。Sortメソッドの第一引数にCompairsonメソッドを与えてカスタムソートを実行します。 カスタムソートの詳細についてはこちらの記事を参照してください。

      itemList.Sort(Compare);


Compairsonメソッドのコードは下記です。MyItemクラスのidプロパティの値で昇順にソートします。

    internal static int Compare(MyItem x, MyItem y)
    {
      if (x.id < y.id)
      {
        return -1;
      }
      else if (x.id > y.id)
      {
        return 1;
      }
      else
      {
        return 0;
      }
    }


ソートしたListオブジェクトの内容をテキストボックスに表示します。

      foreach (MyItem m in itemList)
      {
        textBox1.Text += String.Format("{0:d} {1} {2:d}\r\n", m.id, m.name, m.price);
      }

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。
Dictionary<TKey,T>型をList<T>型に変換する:画像5

[button3]のボタンをクリックします。テキストボックスに下図の内容が表示されます。 MyItemオブジェクトのプロパティ値がIDプロパティの値で昇順にソートされて表示されます。

Dictionary<TKey,T>型をList<T>型に変換する:画像6

AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2022-03-25
Copyright © 1995–2025 iPentec all rights reserverd.