ジェネリックコレクションの1つディクショナリークラスの使い方のまとめです。
ディクショナリーはキーと値のペア(KeyValuePair)のコレクションになります。
リストのインデックスの代わりの名前がキー(Key)、値(Value)はそのままの意味で要素の値になります。
キーと値それぞれにデータ型を指定する必要があります。
キーをint型にしてインデックスのように連番ではなく意味のある数値をキーにして値を取得したり、
キーをstring型にして表の列名を付け、列名で値を取得したりできます。
また、キーは重複しないしように設定する必要があります。
Dictionaryクラスの使い方
ディクショナリークラスを使うには名前空間System.Collections.Genericが必要です。
using System.Collections.Generic;
Dictionaryオブジェクトの宣言と初期化
クラスなのでnewキーワードでインスタンスを作成して使います。
またキーと値のデータ型を指定する必要があります。
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
// キーがint型、値がstring型のDictionary
var dic1 = new Dictionary<int, string>();
// キーがstring型、値がstring型のDictionary
var dic2 = new Dictionary<string, string>();
// キーがstring型、int型のリスト型のDictionary
var dic3 = new Dictionary<string, List<int>>();
}
}
Dictionaryの後ろに<キーの型, 値の型> で型の指定を行います。
初期化について
宣言と同時に値を代入することができます。
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
// キーがint型、値がstring型のDictionary
var dic1 = new Dictionary<int, string>() { { 1, "a" }, { 2, "b" }, { 3, "c" } };
// キーがstring型、値がstring型のDictionary
var dic2 = new Dictionary<string, string>() { { "Coloum1", "a" }, { "Column2", "b" } };
// キーがstring型、intのリスト型のDictionary
var dic3 = new Dictionary<string, List<int>>()
{
{ "No1", new List<int>(){ 1, 2, 3 } },
{ "No2", new List<int>(){ 4, 5, 6 } },
};
}
}
値の代入は { } の中に {キー, 値} をカンマ区切りで指定します。
要素の追加(Add)
Addメソッドでキー、値を指定して要素を追加することができます。
第1引数にはキーに設定する値、
第2引数には値に設定する値を指定します。
どちらも宣言で定義した型である必要があります。
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
// キーがint型、値がstring型のDictionary
var dic1 = new Dictionary<int, string>();
dic1.Add(1, "a");
dic1.Add(2, "b");
// キーがstring型、値がstring型のDictionary
var dic2 = new Dictionary<string, string>();
dic2.Add("Column1", "a");
dic2.Add("Column2", "b");
// キーがstring型、intのリスト型のDictionary
var dic3 = new Dictionary<string, List<int>>();
dic3.Add("No1", new List<int>() { 1, 2, 3 });
dic3.Add("No2", new List<int>() { 4, 5, 6 });
}
}
Addメソッドで要素を追加する際に、重複するキーを指定するとエラーになるので注意してください。
要素の追加、変更(インデクサ)
インデクサ [ ] を使って要素を追加することができます。
こちらは重複するキーを指定した場合、値が上書きされます。
ディクショナリー名[キー] = 値; という感じで追加します。
どちらも宣言で定義した型である必要があります。
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
// キーがint型、値がstring型のDictionary
var dic1 = new Dictionary<int, string>();
dic1[1] = "a";
dic1[2] = "b";
dic1[2] = "c"; // 値を上書き
foreach (KeyValuePair<int, string> kv in dic1) {
Console.WriteLine($"Key={kv.Key}, Valule={kv.Value}");
}
// キーがstring型、値がstring型のDictionary
var dic2 = new Dictionary<string, string>();
dic2["Column1"] = "a";
dic2["Column2"] = "b";
dic2["Column2"] = "c"; // 値を上書き
foreach (var kv in dic2) {
Console.WriteLine($"Key={kv.Key}, Valule={kv.Value}");
}
}
}
出力結果はこんな感じです。
Key=1, Valule=a
Key=2, Valule=c
Key=Column1, Valule=a
Key=Column2, Valule=c
Console.WriteLineで使ってる $ってなに?という人はこちらをご覧ください。
要素の削除(Remove)
Removeメソッドでキーを指定して要素を削除することができます。
引数にはキーを指定します。
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
// キーがstring型、値がstring型のDictionary
var dic2 = new Dictionary<string, string>();
dic2["Column1"] = "a";
dic2["Column2"] = "b";
dic2["Column3"] = "c";
Console.WriteLine("Remove前");
foreach (var kv in dic2) {
Console.WriteLine($"Key={kv.Key}, Valule={kv.Value}");
}
dic2.Remove("Column3");
Console.WriteLine("Remove後");
foreach (var kv in dic2) {
Console.WriteLine($"Key={kv.Key}, Valule={kv.Value}");
}
}
}
出力結果はこんな感じです。
Remove前
Key=Column1, Valule=a
Key=Column2, Valule=b
Key=Column3, Valule=c
Remove後
Key=Column1, Valule=a
Key=Column2, Valule=b
各要素を取り出す(foreach)
foreachを使うと各要素を取り出すことが出来ます。
上のサンプルコードですでに使っていますが、foreachのコレクションにDictionaryを指定するとKeyValuePairというクラスが各要素として返っています。
KeyValuePairの宣言もキーと値それぞれの型を指定する必要があるため、var を使うと便利です。
キーを取得するにはKeyValuePairのKeyプロパティ、
値を取得するにはKeyValuePairのValueプロパティを使います。
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
// キーがstring型、値がstring型のDictionary
var dic2 = new Dictionary<string, string>();
dic2["Column1"] = "a";
dic2["Column2"] = "b";
dic2["Column3"] = "c";
foreach (var kv in dic2) {
Console.WriteLine($"Key={kv.Key}, Valule={kv.Value}");
}
}
}
Key=Column1, Valule=a
Key=Column2, Valule=b
Key=Column3, Valule=c
各要素を取り出す(インデクサ)
インデクサ [ ] にキーを指定して要素を取り出すことができます。
こちらは存在しないキーを指定するとエラーになってしまいます。
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
// キーがint型、値がstring型のDictionary
var dic1 = new Dictionary<int, string>();
dic1.Add(1, "a");
dic1.Add(2, "b");
System.Console.WriteLine(dic1[1]);
// キーがstring型、値がstring型のDictionary
var dic2 = new Dictionary<string, string>();
dic2.Add("Column1", "a");
dic2.Add("Column2", "b");
Console.WriteLine(dic2["Column2"]);
}
}
a
b
指定したキーが存在していたら値を取得する(TryGetValue)
TryGetValueメソッドを使うとキーが存在していた場合に値を取り出すことができます。
存在していないキーを指定した場合もエラーにはなりません。
第1引数にキー、第2引数に値を代入するための変数を指定します。
戻り値はキーが存在した場合にTrue、なかった場合はFalseが返ってきます。
なので戻り値がTrueの場合は値が取得できたということになります。
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
// キーがstring型、値がstring型のDictionary
var dic2 = new Dictionary<string, string>();
dic2.Add("Column1", "a");
dic2.Add("Column2", "b");
Console.WriteLine(dic2.TryGetValue("Column2", out string col2_Value));
Console.WriteLine(col2_Value);
Console.WriteLine(dic2.TryGetValue("Column99", out string col99_Value));
Console.WriteLine(col99_Value);
}
}
出力結果はこんな感じです。
True
b
False
変数col99_Valueは出力されていませんが、値は取得されずnullが入っています。
第2引数にある out ってなに?という人はこちらをご覧ください。
指定したキーがすでに存在しているかチェックする
キーが重複しているか判定するにはContainKeysメソッドを使います。
ContainKeysメソッドは引数で指定されたキーがすでにディクショナリー内にある場合はTrue、ない場合にFalseを返します。
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
// キーがstring型、値がstring型のDictionary
var dic2 = new Dictionary<string, string>();
dic2.Add("Column1", "a");
dic2.Add("Column2", "b");
// キーの重複チェック
Console.WriteLine(dic2.ContainsKey("Column1")); // True
Console.WriteLine(dic2.ContainsKey("Column99")); // False
}
}
キーの一覧を取得する
Keysプロパティを使うをディクショナリーに格納されているキーの一覧を取得することができます。
Keysは宣言で定義したキーの型のコレクションになっています。
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
// キーがstring型、値がstring型のDictionary
var dic2 = new Dictionary<string, string>();
dic2["Column1"] = "a";
dic2["Column2"] = "b";
dic2["Column3"] = "c";
// キーの一覧を取得
foreach (var key in dic2.Keys) {
Console.WriteLine(key);
}
}
}
Column1
Column2
Column3
C# 記事まとめページに戻る(他のサンプルコードもこちら)
コメント