C#ハッシュテーブルとディクショナリの違い
Hashtable と Dictionaryの違い
1. Hashtable で追加される要素はオブジェクト型ですが、Dictionary で追加される要素は指定された (T) 型です。
2.辞書には、ジェネリック、より高速な読み取り速度、およびより十分に活用された容量という利点があります。
3. foreach ループでは、Dictionary はサブオブジェクトを取得できますが、Hashtable は取得できません。
ハッシュテーブル
Hashtable を使用するには、名前空間 System.Collections を導入する必要があります。Hashtable のキーと値のキーと値のペアはすべてオブジェクト型であるため、Hashtable はあらゆるタイプのキーと値のキーと値のペアをサポートできます。Hashtable の各オブジェクトは、DictionaryEntry オブジェクトに格納されたキーと値のペアです。
共通属性
属性 | 説明 |
---|---|
カウント | Hashtable に含まれるキーと値のペアの数を取得する |
キー | Hashtable 内のすべてのキーのコレクションを取得する |
値 | Hashtable のすべての値のコレクションを取得する |
一般的な方法
方法 | 説明 |
---|---|
public virtual void Add(オブジェクト キー、オブジェクト値); | 指定されたキーと値を持つ要素を Hashtable に追加します |
public virtual bool ContainsKey(オブジェクト キー); | Hashtable に指定されたキーが含まれているかどうかを判断する |
public virtual bool ContainsValue(オブジェクト値); | Hashtable に指定された値が含まれているかどうかを判断する |
public virtual void Remove(オブジェクトキー); | 指定されたキーを持つ要素を Hashtable から削除します |
public virtual void Clear(); | Hashtable からすべての要素を削除する |
注: IDictionary インターフェイスは、キーと値のペアの非ジェネリック コレクションの基本インターフェイスであり、各要素はキーと値のペアで、DictionaryEntry オブジェクトに格納されるため、要素の型はキーの型でも、型でもありません。値型の型ですが、DictionaryEntry 型です。(穴を残してください、それが何であるかわかりませんでした)
Hashtable ht = new Hashtable();
ht.Add(1, true);
ht.Add(2, "FALSE");
Console.WriteLine("当前包含键值对个数:{0}", ht.Count);//输出:2
Console.WriteLine("---- 通过键求键值对 ----");
foreach (var key in ht.Keys)
{
Console.WriteLine("{0} - {1}", key, ht[key]);//输出:2-"FALSE" 1-True
}
Console.WriteLine("---- 添加后值的集合 ----");
foreach (var value in ht.Values)
{
Console.WriteLine("{0}", value);//输出:FALSE True
}
if (ht.ContainsKey(1))
{
Console.WriteLine("Hashtable中包含键 1 .");//输出
}
if(ht.ContainsValue(true))
{
Console.WriteLine("Hashtable中包含值 true .");//输出
}
ht.Remove(1);
Console.WriteLine("---- 移除键 1 之后 ----");
foreach(DictionaryEntry de in ht)
{
Console.WriteLine("{0} - {1}", de.Key, de.Value);//输出:2 - FALSE
}
ht.Clear();
Console.WriteLine("---- 移除全部之后 ----");
foreach (DictionaryEntry de in ht)
{
Console.WriteLine("{0} ------- {1}", de.Key, de.Value);//无输出
}
Console.ReadKey();
辞書辞書
Dictionary<TKey, TValue> は System.Collections.Generic 名前空間に含まれています。Dictionary<TKey, TValue> は、指定された任意の型のキーと値のキーと値のペアをサポートできます。そのため、Dictionary<TKey, TValue> オブジェクトは、指定された型のキーと値のペアのみを追加できます。Dictionary<TKey, TValue> の各オブジェクトは、KeyValuePair<TKey, TValue> オブジェクトに格納されているキーと値のペアです。
共通属性
属性 | 説明 |
---|---|
カウント | Dictionary<TKey, TValue> に含まれるキーと値のペアの数を取得します |
アイテム | Dictionary<TKey, TValue> でキーと値のペアを取得する |
キー | Dictionary<TKey, TValue> 内のすべてのキーのコレクションを取得します |
値 | Dictionary<TKey, TValue> 内のすべての値のコレクションを取得します |
一般的な方法
方法 | 説明 |
---|---|
public void Add(TKey キー、TValue 値); | 指定されたキーと値を辞書に追加します |
public bool ContainsKey(TKey キー); | Dictionary<TKey, TValue> に指定されたキーが含まれているかどうかを判断します |
public bool ContainsValue(TValue 値); | Dictionary<TKey, TValue> に指定された値が含まれているかどうかを判断します |
public bool Remove(TKey キー); | 指定されたキーの要素をDictionary<TKey, TValue> から削除します |
public void Clear(); | Dictionary<TKey, TValue> からすべてのキーと値のペアを削除します |
Dictionary<int, string> dc = new Dictionary<int, string>();
dc.Add(21002121, "张三");
dc.Add(21002122, "李四");
Console.WriteLine("字典中的键值对个数:{0}", dc.Count);//输出:2
Console.WriteLine("---- 添加之后键值对 ----");
foreach (var item in dc)
{
Console.WriteLine("{0} - {1}", item.Key, item.Value);//输出:21002121 - 张三 21002122 - 李四
}
Console.WriteLine("---- 通过键求键值对 ----");
foreach (var key in dc.Keys)
{
Console.WriteLine("{0} - {1}", key, dc[key]);//输出:21002121 - 张三 21002122 - 李四
}
Console.WriteLine("---- 添加后值的集合 ----");
foreach (var value in dc.Values)
{
Console.WriteLine("{0}", value);//张三 李四
}
if(dc.ContainsKey(21002121))
{
Console.WriteLine("Dictionary中包含键 21002121 .");//输出
}
if(dc.ContainsValue("李四"))
{
Console.WriteLine("Dictionary中包含值 李四 .");//输出
}
dc.Remove(21002121);
Console.WriteLine("---- 移除键 21002121 之后 ----");
foreach (KeyValuePair<int, string> kp in dc)
{
Console.WriteLine("{0} - {1}", kp.Key, kp.Value);//输出:21002122 - 李四
}
dc.Clear();
Console.WriteLine("---- 移除全部之后 ----");
foreach (KeyValuePair<int, string> kp in dc)
{
Console.WriteLine("{0} ----- {1}", kp.Key, kp.Value);//无输出
}
Console.ReadKey();
ハッシュテーブルと辞書の挿入時間の比較
Dictionary<int, int> dc = new Dictionary<int, int>();
Hashtable ht = new Hashtable();
int count = 10000000;//插入的次数 1千万
Stopwatch sw = new Stopwatch();
sw.Start();//计时
for(int i = 0; i < count; i++)
{
dc.Add(i, i);
}
sw.Stop();
Console.WriteLine("字典Dictionary<TKey, TValue>耗时(毫秒):" + sw.ElapsedMilliseconds);//输出:388
sw.Restart();
for (int i = 0; i < count; i++)
{
ht.Add(i, i);
}
sw.Stop();
Console.WriteLine("哈希表Hashtable耗时(毫秒):" + sw.ElapsedMilliseconds);//输出:2497
Console.ReadLine();
注: 消費される時間は一意ではありません. 平均的なパフォーマンスのコンピューターの場合, 挿入数を減らすことをお勧めします.
著者のエネルギーが限られているため、記事には間違いや脱落が避けられませんが、専門家やネチズンは私を批判して修正することを歓迎します。