C#ハッシュテーブルとディクショナリの違い

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();

注: 消費される時間は一意ではありません. 平均的なパフォーマンスのコンピューターの場合, 挿入数を減らすことをお勧めします.

著者のエネルギーが限られているため、記事には間違いや脱落が避けられませんが、専門家やネチズンは私を批判して修正することを歓迎します。

おすすめ

転載: blog.csdn.net/qq_46051312/article/details/123632469