Dictionaryクラスのメソッド

Dictionaryクラスの操作

ここではよく使われるDictionaryクラスのメソッドを紹介します。
Dictionaryクラスについての基本的な事柄はDictionaryクラスを参照してください。

追加

Add(要素の追加)

Addメソッドは要素を追加します。


//空のDictionaryを作成
var dct = new Dictionary<string, int>();

//要素を追加
dct.Add("aaa", 5);
dct.Add("bbb", 7);
dct.Add("ccc", 9);

foreach (var kvp in dct)
    Console.WriteLine("{0}: {1}", kvp.Key, kvp.Value);
aaa: 5
bbb: 7
ccc: 9

第一引数にはキー、第二引数には値を指定します。
それぞれの値のデータ型は追加するDictionaryクラスのデータ型に合わせます。
戻り値はありません。

Addメソッドは「要素の追加」しかできず、既存の値を上書きすることはできません。
すでに存在するキーを指定するとエラーになります。


var dct = new Dictionary<string, int>();

dct.Add("aaa", 5);

//エラー
dct.Add("aaa", 10);

//これはOK
dct["aaa"] = 10;

TryAdd(Keyが存在しなければ要素を追加)

TryAddメソッドは、キーが存在しない場合に要素を追加します。
このメソッドは.NET Frameworkでは使用できません。


var dct = new Dictionary<string, int>();

//キーが存在しなければ追加
dct.TryAdd("aaa", 5);
dct.TryAdd("bbb", 7);
dct.TryAdd("aaa", 9);

foreach (var kvp in dct)
    Console.WriteLine("{0}: {1}", kvp.Key, kvp.Value);
aaa: 5
bbb: 7

要素を追加した場合はtrue、既にキーが存在する場合はfalseを返します。

Addメソッドはすでにキーが存在する場合はエラー(例外送出)になりますが、このメソッドはエラーになりません。
添字演算子はキーが存在する場合は値を上書きしますが、このメソッドは上書きも行いません。

削除

Remove(要素の削除)

Removeメソッドは指定のキーを持つ要素を削除します。


var dct = new Dictionary<string, int>() {
    { "aaa", 5 },
    { "bbb", 7 },
    { "ccc", 9 },
};

//要素を削除
bool bo1 = dct.Remove("bbb"); //true
bool bo2 = dct.Remove("zzz"); //false

foreach (var kvp in dct)
    Console.WriteLine("{0}: {1}", kvp.Key, kvp.Value);
aaa: 5
ccc: 9

削除に成功した場合は真を、要素が見つからなかった場合は偽を返します。

削除した要素を取得する

Removeメソッドは、第二引数で変数をout参照渡しすることで、削除した要素の値を受け取ることができます。


var dct = new Dictionary<string, int>() {
    { "aaa", 5 },
    { "bbb", 7 },
    { "ccc", 9 },
};

//要素を削除し、削除した要素を取得
int n;
if (dct.Remove("bbb", out n))
{
    Console.WriteLine(n);
}
7

Clear(要素をすべて削除)

Clearメソッドは、Dictionaryクラスの要素をすべて削除します。


var dct = new Dictionary<string, int>() {
    { "aaa", 5 },
    { "bbb", 7 },
    { "ccc", 9 },
};

//要素をすべて削除
dct.Clear();

Console.WriteLine(dct.Count); //0

存在判定

ContainsKey(指定のKeyの存在判定)

ContainsKeyメソッドは、指定のキーを持つ要素が存在するかを判定します。


var dct = new Dictionary<string, int>() {
    { "aaa", 5 },
    { "bbb", 7 },
    { "ccc", 9 },
};

bool bo1 = dct.ContainsKey("aaa"); //true
bool bo2 = dct.ContainsKey("zzz"); //false

ContainsValue(指定のValueの存在判定)

ContainsValueメソッドは、指定の値を持つ要素が存在するかを判定します。


var dct = new Dictionary<string, int>() {
    { "aaa", 5 },
    { "bbb", 7 },
    { "ccc", 9 },
};

bool bo1 = dct.ContainsValue(5); //true
bool bo2 = dct.ContainsValue(999); //false

値の取得

TryGetValue(指定のKeyのValueを取得)

TryGetValueメソッドは、指定のキーを持つ要素が存在する場合にその値を取得します。


var dct = new Dictionary<string, int>() {
    { "aaa", 5 },
    { "bbb", 7 },
    { "ccc", 9 },
};

int tryGetValue1;
int tryGetValue2;

bool bo1 = dct.TryGetValue("aaa", out tryGetValue1); //true
bool bo2 = dct.TryGetValue("zzz", out tryGetValue2); //false

Console.WriteLine(tryGetValue1);
Console.WriteLine(tryGetValue2);
5
0

TryGetValueメソッドの第二引数はout修飾子を同時に指定します。
Dictionary内に第一引数で指定したキーが存在する場合は変数に値が格納されます。
キーが存在しない場合は既定値が格納されます。

戻り値はキーが存在する場合は真、存在しない場合は偽を返します。

容量

EnsureCapacity(容量の確保)

EnsureCapacityメソッドは、Dictionaryクラスの容量を設定します。
このメソッドは.NET Frameworkでは使用できません。


var dct = new Dictionary<string, int>() {
    { "aaa", 5 },
    { "bbb", 7 },
    { "ccc", 9 },
};

//容量の確認
Console.WriteLine(dct.EnsureCapacity(0));
//容量を少なくとも10に設定
Console.WriteLine(dct.EnsureCapacity(10));
3
11

戻り値は現在の容量です。

引数の値は最低限格納できる要素数の指定で、実際に確保される容量は引数の値以上です。

TrimExcess(容量の縮小)

TrimExcessメソッドは、Dictionaryクラスの不要な容量を削除します。
このメソッドは.NET Frameworkでは使用できません。


var dct = new Dictionary<int, int>();
for (int i = 0; i < 10; i++)
    dct[i] = i; 

//現在の容量の確認
Console.WriteLine(dct.EnsureCapacity(0));

dct.Remove(0);

//容量の縮小
dct.TrimExcess();
Console.WriteLine(dct.EnsureCapacity(0));
17
11

戻り値はありません。

Dictionaryクラスの容量は処理の高速化のためにクラス側が管理しています。
Visual Studioコンパイラでは素数になるように実装されているようです。

引数に数値を指定することで、最低限確保しておく容量を指定することもできます。
ただしこのメソッドは容量の縮小はできますが、拡張はできません。


//容量が最低100のDictionaryクラス
var dct = new Dictionary<int, int>(100);
Console.WriteLine(dct.EnsureCapacity(0));

//最低50に縮小
dct.TrimExcess(50);
Console.WriteLine(dct.EnsureCapacity(0));

//以前より大きいサイズに拡張はできない
dct.TrimExcess(100);
Console.WriteLine(dct.EnsureCapacity(0));
107
59
59