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