C# ハッシュテーブル(Hashtable)
C# では、ハッシュテーブル(Hashtable)はキーと値のペア(key=>value)の形式でデータを格納するコレクションであり、キーと値は任意のオブジェクトにすることができます。
ハッシュテーブルの各項目にはkey=>valueキーと値のペアがあり、key はコレクション内の項目にアクセスするために使用されます。
ハッシュテーブルはハッシュアルゴリズムに基づいてデータを整理・アクセスし、効率的な検索、挿入、削除操作を提供します。
Hashtable非ジェネリックコレクションであり、名前空間System.Collectionsにあります。ジェネリックバージョンが必要な場合は、次を使用できます:Dictionary<TKey, TValue>。
基本構造:
- 键(
Key):各データ項目を識別するために使用され、一意である必要があり、null にすることはできません。null。 - 值(
Value):キーに対応するデータで、null にすることができます。null。
特徴:
- キーと値のペアの格納:各キーは一意であり、1つの値に関連付けられます。
- ハッシュアルゴリズム:キーのハッシュコードによってデータの格納位置を特定し、検索および挿入操作の平均時間計算量は O(1) です。
- 容量の動的調整:ハッシュテーブル内の要素数が容量を超えると、テーブルは動的に拡張され、ストレージが再割り当てされます。
- 順序なしの格納:キーと値のペアの格納順序は挿入順序とは無関係で、ハッシュコードによって決まります。
Hashtable クラスのメソッドとプロパティ
次の表はHashtableクラスの一般的なプロパティを示しています。:
| プロパティ名 | 型 | 説明 |
|---|---|---|
Count | int | ハッシュテーブルに含まれるキーと値のペアの数を取得します。 |
IsReadOnly | bool | ハッシュテーブルが読み取り専用かどうかを示します。 |
IsFixedSize | bool | ハッシュテーブルが固定サイズかどうかを示します。 |
IsSynchronized | bool | ハッシュテーブルがスレッドセーフかどうかを示します。 |
Keys | ICollection | ハッシュテーブル内のすべてのキーのコレクションを取得します。 |
Values | ICollection | ハッシュテーブル内のすべての値のコレクションを取得します。 |
SyncRoot | object | ハッシュテーブルへの同期アクセスに使用できるオブジェクトを取得します。 |
次の表はHashtableクラスの一般的なメソッドを示しています。:
| メソッド名 | 戻り値の型 | 説明 |
|---|---|---|
| 追加と削除 | ||
Add(object key, object value) | void | 指定されたキーと値のペアをハッシュテーブルに追加します。 |
Clear() | void | ハッシュテーブルを空にします。 |
Remove(object key) | void | 指定されたキーのキーと値のペアを削除します。 |
| クエリとアクセス | ||
Contains(object key) | bool | ハッシュテーブルに指定されたキーが含まれているかどうかを判断します。 |
ContainsKey(object key) | bool | ハッシュテーブルに指定されたキーが含まれているかどうかを判断します(ContainsKey と同等)Contains)。 |
ContainsValue(object value) | bool | ハッシュテーブルに指定された値が含まれているかどうかを判断します。 |
| コピーと列挙 | ||
CopyTo(Array array, int index) | void | ハッシュテーブルの要素を配列にコピーします。指定されたインデックスから開始します。 |
GetEnumerator() | IDictionaryEnumerator | ハッシュテーブルの列挙子を返し、キーと値のペアを反復処理するために使用します。 |
例
以下の例は、ハッシュテーブル(Hashtable)の概念を示しています:
例
using System;
using System.Collections;
namespace CollectionsApplication
{
class Program
{
static void Main(string[] args)
{
Hashtable ht = new Hashtable();
ht.Add("001", "Zara Ali");
ht.Add("002", "Abida Rehman");
ht.Add("003", "Joe Holzner");
ht.Add("004", "Mausam Benazir Nur");
ht.Add("005", "M. Amlan");
ht.Add("006", "M. Arif");
ht.Add("007", "Ritesh Saikia");
if (ht.ContainsValue("Nuha Ali"))
{
Console.WriteLine("This student name is already in the list");
}
else
{
ht.Add("008", "Nuha Ali");
}
// キーのコレクションを取得
ICollection key = ht.Keys;
foreach (string k in key)
{
Console.WriteLine(k + ": " + ht[k]);
}
Console.ReadKey();
}
}
}
using System.Collections;
namespace CollectionsApplication
{
class Program
{
static void Main(string[] args)
{
Hashtable ht = new Hashtable();
ht.Add("001", "Zara Ali");
ht.Add("002", "Abida Rehman");
ht.Add("003", "Joe Holzner");
ht.Add("004", "Mausam Benazir Nur");
ht.Add("005", "M. Amlan");
ht.Add("006", "M. Arif");
ht.Add("007", "Ritesh Saikia");
if (ht.ContainsValue("Nuha Ali"))
{
Console.WriteLine("This student name is already in the list");
}
else
{
ht.Add("008", "Nuha Ali");
}
// キーのコレクションを取得
ICollection key = ht.Keys;
foreach (string k in key)
{
Console.WriteLine(k + ": " + ht[k]);
}
Console.ReadKey();
}
}
}
上記のコードがコンパイルおよび実行されると、次の結果が生成されます:
007: Ritesh Saikia 004: Mausam Benazir Nur 005: M. Amlan 008: Nuha Ali 002: Abida Rehman 003: Joe Holzner 001: Zara Ali 006: M. Arif
他のコレクションとの比較
| 特徴 | Hashtable | Dictionary<TKey, TValue> |
|---|---|---|
| 型の安全性 | いいえ(非ジェネリック、格納されるobject型) | はい(ジェネリック、強い型の制約) |
| パフォーマンス | 遅い(ボックス化とボックス化解除の操作が必要) | 速い(ボックス化なし、ジェネリックが型を直接サポート) |
| キーの一意性 | である | である |
値は null にできるかnull | である | である |
| 並べ替え | 无 | 无 |
| スレッドセーフ | デフォルトではスレッドセーフではない | デフォルトではスレッドセーフではない |
Hashtableは効率的なキーと値のペアのコレクションですであり、キーと値のペアを高速に保存および取得する必要があるシナリオに適しています。- 非ジェネリックの設計は、型の安全性とパフォーマンスの面でジェネリックバージョンのコレクション(例:
Dictionary<TKey, TValue>)。 - 現代の C# 開発では、
Dictionary<TKey, TValue>がより一般的に使用されますが、Hashtableは、単純なアプリケーションやレガシーコードとの互換性が必要なシナリオに今でも適しています。
C# コレクション