C#にはJavaのような「HashMap」という名前のクラスは直接ありません。しかし、Dictionary<TKey, TValue>
クラスが同等の機能を提供しており、ハッシュマップ操作の推奨アプローチです。
目次
Dictionary<TKey, TValue>
をハッシュマップとして使用
Dictionary<TKey, TValue>
は、挿入、削除、取得などの一般的な操作に対して平均O(1)の時間計算量を持つキーバリューストアを提供します。TKey
はキーの型を指定し、TValue
は関連付けられた値の型を定義します。使用方法を見てみましょう。
辞書の作成とデータの追加
// 文字列をキー、整数を値として格納する辞書を作成します。
Dictionary<string, int> myDictionary = new Dictionary<string, int>();
// Add()を使用してキーバリューペアを追加します
myDictionary.Add("apple", 1);
myDictionary.Add("banana", 2);
myDictionary.Add("cherry", 3);
// または、コレクション初期化子構文を使用します。
Dictionary<string, int> anotherDictionary = new Dictionary<string, int>()
{
{"grape", 4},
{"orange", 5}
};
値へのアクセス
キーを使用して値を取得します。TryGetValue()
は直接インデックスアクセスよりも安全で、キーが存在しない場合を処理します。
int appleCount;
if (myDictionary.TryGetValue("apple", out appleCount))
{
Console.WriteLine($"Apple count: {appleCount}"); // 出力: Apple count: 1
}
else
{
Console.WriteLine("Apple not found.");
}
// 直接アクセス (キーが存在しない場合、KeyNotFoundExceptionをスローします)
try
{
Console.WriteLine($"Banana count: {myDictionary["banana"]}"); // 出力: Banana count: 2
}
catch (KeyNotFoundException)
{
Console.WriteLine("Key not found.");
}
辞書の反復処理
Console.WriteLine("Dictionary contents:");
foreach (KeyValuePair<string, int> kvp in myDictionary)
{
Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}");
}
要素の削除
myDictionary.Remove("banana");
キーの存在確認
if (myDictionary.ContainsKey("cherry"))
{
Console.WriteLine("Cherry exists.");
}
高度な使用方法と考慮事項
スレッドセーフが必要な場合は、ConcurrentDictionary<TKey, TValue>
を検討してください。キーを選択する際には、衝突を回避し、ハッシュマップの効率を維持するために、GetHashCode()
とEquals()
を正しく実装していることを確認してください。これらの点を理解することは、最適なパフォーマンスを得るために不可欠です。
結論
C#のDictionary<TKey, TValue>
はHashMapの有効な代替であり、キーバリューストアに対して優れたパフォーマンスを提供します。その汎用性と、スレッドセーフな代替手段の可用性を組み合わせることで、様々なC#アプリケーションにおいて基本的なデータ構造となっています。