今回は、C#のContainsKeyで辞書内に特定のキーが存在するか判別する方法をご紹介します。
ContainsKeyメソッドとは
Dictionary クラスにおける ContainsKey メソッドは、指定したキーがディクショナリに含まれているかどうかを真偽値で返す機能です。
キーが存在すれば true、存在しなければ false となります。
辞書内にデータが登録されているかを高速に判定できるため、データの有無をチェックする際によく用いられます。
基本的な使い方
以下の例では、int 型をキー、string 型を値とするディクショナリを用意し、指定したキーが存在するかを ContainsKey で確認しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System; using System.Collections.Generic; public class Program { public static void Main() { // int型をキー、string型を値とするディクショナリの初期化 Dictionary<int, string> dict = new Dictionary<int, string>() { { 1, "one" }, { 2, "two" }, { 3, "three" } }; int keyToCheck = 2; // キーの存在をチェック if (dict.ContainsKey(keyToCheck)) { Console.WriteLine($"キー {keyToCheck} は存在します。対応する値は '{dict[keyToCheck]}' です。"); } else { Console.WriteLine($"キー {keyToCheck} は存在しません。"); } } } |
キー 2 は存在します。対応する値は ‘two’ です。
ContainsKey は内部的にハッシュテーブルを利用しているため、キーの存在チェックを高速に行えます。
また、キーが存在するかを事前に確かめることで、KeyNotFoundException を回避することが可能です。
文字列キーでの活用例
文字列をキーにしたい場合、デフォルトでは大文字と小文字が区別されます。
必要に応じて StringComparer.OrdinalIgnoreCase などを指定し、大文字小文字を区別しないディクショナリを作ることもできます。
下記では、string 型をキー、int 型を値とするディクショナリにおいて、同様にキーの存在をチェックしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System; using System.Collections.Generic; public class Program { public static void Main() { // string型をキー、int型を値とするディクショナリの初期化 Dictionary<string, int> fruitCounts = new Dictionary<string, int>() { { "apple", 3 }, { "banana", 5 }, { "orange", 2 } }; string keyToCheck = "banana"; // キーの存在をチェック if (fruitCounts.ContainsKey(keyToCheck)) { Console.WriteLine($"キー '{keyToCheck}' は存在し、出現回数は {fruitCounts[keyToCheck]} です。"); } else { Console.WriteLine($"キー '{keyToCheck}' は存在しません。"); } } } |
キー ‘banana’ は存在し、出現回数は 5 です。
このように ContainsKey でキーが存在するかをチェックしてから、値の取得を行うのが一般的な流れです。
TryGetValueとの使い分け
TryGetValue はキーの存在を確認しつつ、値を同時に取得できるメソッドです。
ContainsKey を使った場合、ディクショナリへのアクセスが最大2回発生しますが、TryGetValue は1回の呼び出しで完結します。
パフォーマンス向上や二重アクセスの回避を目的とする場合に便利です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using System; using System.Collections.Generic; public class Program { public static void Main() { Dictionary<string, string> capitals = new Dictionary<string, string>() { { "Japan", "Tokyo" }, { "France", "Paris" }, { "UK", "London" } }; string key = "France"; // TryGetValueでキーの存在確認と値の取得を同時に実施 if (capitals.TryGetValue(key, out string capital)) { Console.WriteLine($"{key} の首都は {capital} です。"); } else { Console.WriteLine($"{key} はディクショナリに存在しません。"); } } } |
France の首都は Paris です。
単にキーの存在をチェックするだけなら ContainsKey、値の取得まで行いたい場合は TryGetValue を利用すると効率的です。
注意点
- 二重アクセスの回避: ContainsKey を呼んだ直後にディクショナリへアクセスすると、ディクショナリへの操作が2度行われます。頻繁に参照する場合は TryGetValue を検討してください。
- 大文字小文字の扱い: 文字列キーはデフォルトで大文字小文字を区別します。大文字小文字を無視したい場合は、ディクショナリ生成時に StringComparer.OrdinalIgnoreCase などを指定する必要があります。
- スレッドセーフ: Dictionary はスレッドセーフではありません。複数スレッドで同時に更新する場合は ConcurrentDictionary などを利用するか、排他制御を行ってください。
- KeyNotFoundException: 存在しないキーに直接アクセスすると例外が発生します。ContainsKey や TryGetValue で事前チェックを行うことが推奨されます。
まとめ
ContainsKey はディクショナリ内のキー存在確認において、シンプルかつ高速に動作するメソッドです。
文字列キーを扱う際の大小文字の区別や、パフォーマンス向上のための TryGetValue といった選択肢も理解しておくと便利です。
適切に使い分けることで、より安全で効率的なデータアクセスが実現できます。