Dictionary<TKey,T>型をList<T>型に変換するコードを紹介します。
Dictionaryオブジェクトに格納されている値やキーをListオブジェクトに変換したい場合があります。この記事では、DictionaryオブジェクトをListオブジェクトに変換するコードを紹介します。
次の2つの方法があります。
下図のフォームを作成します。テキストボックスとボタンを配置します。
下記のコードを記述します。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);
}
プロジェクトを実行します。下図のウィンドウが表示されます。
[button1]ボタンをクリックします。Dictionaryオブジェクトに設定したMyItemオブジェクトの値がテキストボックスに表示されます。
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オブジェクトに変換して、ソートするコードの例を紹介します。
下図のフォームを作成します。ボタンは[button3]のみを利用します。
下記のコードを記述します。[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);
}
プロジェクトを実行します。下図のウィンドウが表示されます。
[button3]のボタンをクリックします。テキストボックスに下図の内容が表示されます。
MyItemオブジェクトのプロパティ値がIDプロパティの値で昇順にソートされて表示されます。