C# での Hashtable と Dictionary のコード例:
Dictionary
ハッシュテーブルはジェネリックではなく、タイプセーフでもありません。 Hashtableのキー値はすべてObject型ですが、Dictionaryキー値のデータ型を指定することができます。
つまり、HashtableにObject以外のデータ型が格納されている場合、データを取り出す際に型変換して表示しないと正常に使用できません。辞書にはこの問題はありません。
この点で、Hashtable は Dictionary
Hashtable ht = new Hashtable(); Dictionary<string, int> dic = new Dictionary<string, int>(); ht.Add("A", 1); dic.Add("A", 1); //Console.WriteLine(ht["A"]+1); //编译错误!Object类型不能和int类型直接进行相加。 Console.WriteLine((int)ht["A"] + 1);//编译通过,输出结果为:2 Console.WriteLine(dic["A"] + 1); //编译通过,输出结果为:2
2つ目は、データを読み取る順序とデータを追加する順序の一貫性です
辞書は追加のみで削除はしない場合、データの読み取り順序を追加時の順序と一致させることができます。 ただし、削除および追加操作の後は、データの読み取り順序が追加時の順序と同じであることは保証されなくなります。
りーDictionaryの場合、要素を削除すると、削除された要素の位置に新しく追加された要素が埋められるため、データの追加順序とデータの読み取り順序が矛盾します。
Hashtable は、データの格納順序が一定のアルゴリズムに従って計算されているため、データの読み込み順序とデータの追加順序が一致しない場合がほとんどです。
したがって、データを追加するときに順序を維持する必要がある場合は、辞書とハッシュテーブルを使用しないことをお勧めします。
第三に、存在しない Key 値を使用して Hashtable または Dictionary の値を取得する場合
Hashtable の場合、存在しない Key 値を使用して値を取得すると、null が返されます;
Dictionary<int, int> dic = new Dictionary<int, int>(); dic.Add(0, 0); dic.Add(1, 1); dic.Add(2, 2); Console.WriteLine("仅仅经过添加元素处理之后:"); foreach (KeyValuePair<int, int> kvp in dic) { Console.WriteLine("Key:" + kvp.Key + " Value:" + kvp.Value); } dic.Remove(0); dic.Add(3, 3); Console.WriteLine("经过删除和添加元素处理之后:"); foreach (KeyValuePair<int, int> kvp in dic) { Console.WriteLine("Key:" + kvp.Key + " Value:" + kvp.Value); } Console.ReadKey();
したがって、辞書またはハッシュテーブルから値を取得するときは、予期しない値や例外を防ぐために、最初に Key 値が存在するかどうかを判断する (ContainsKey() メソッドを使用して判断する) ことができます。
4 つ目、スレッドの安全性
ディクショナリはスレッドセーフではありませんが、ハッシュテーブルはスレッドセーフです。
以上がC# のハッシュテーブルとディクショナリのコード例の簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。