C# Programming

C#でDictionaryを使ったハッシュマップ完全マスター

Spread the love

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#アプリケーションにおいて基本的なデータ構造となっています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です