C#中キー値対タイプHashtableとDictionaryの比較と関連用法
2151 ワード
最近ではC#のHashtableとDictionaryを使っているときに、その違いを知りたくて、ネット関連ブログの資料を探して、以下のようにまとめました.
HashtableとDictionaryはいずれもキー値ペアとしてのキャリアであるが,異なるデータ構造を採用している.JavaにおけるArrayListとLinkListのように,集合キャリアとしてListインタフェースを実現しているが,その内部構造は異なり,ArrayListは配列によって実現され,LinkListはオブジェクトチェーンテーブルによって実現されている.
HashtableとDictionaryが同時に存在するため、使用シーンには必然的に選択性が存在し、いつでも互いに取って代わることができる.
[1]シングルスレッドプログラムではDictionaryの使用が推奨されており、汎用的な利点があり、読み取り速度が速く、容量利用がより十分である.[2]マルチスレッドプログラムではHashtableの使用が推奨されている.デフォルトのHashtableではシングルスレッド書き込み、マルチスレッド読み出しが許可されている.Hashtableに対してSynchronized()メソッドをさらに呼び出すと完全なスレッドセキュリティのタイプが得られる.Dictionaryはスレッドセキュリティではなく、lock文を人為的に使用する保護が必要となり、効率が大幅に低下する.[3]Dictionaryは挿入順にデータを並べる特性がある(注:ただしRemove()を呼び出してノードを削除すると順番が狂う)ため、順序を体現する必要がある状況でDictionaryを使用すると一定の便利さが得られる.
個人的にはDictionaryを使う傾向があります.汎用的で制御性が強いからです.いくつかの資料の中で、多くの人もDictionaryを使うことを推薦して、その原因は主にあります
1、Dicはタイプが安全で、より丈夫で読みやすいコードを書くのに役立ち、強制的に変換する手間を省くことができます.2、Dicは汎行であり、KまたはVが値タイプである場合、その速度はHashtableをはるかに上回る.オブジェクトの処理には明示的または暗黙的な変換は必要ありません.値タイプの処理には箱詰めは必要ありません.そのため、使いやすく、効率が高く(符号化効率、実行効率)、エラーが発生しにくい.
DictionaryがAddメソッドを呼び出す前にContainsKeyメソッドを使用してキーが存在するかどうかをテストします.そうしないと、KeyNotFoundExceptionが得られます.プログラムが辞書に存在しないキーを頻繁に試行する場合、TryGetValueメソッドを使用して値を取得する方法は、より効率的な値の取得方法です.
次に、遍歴、追加、削除など、Dictionaryの一般的な操作を示します.
HashtableとDictionaryはいずれもキー値ペアとしてのキャリアであるが,異なるデータ構造を採用している.JavaにおけるArrayListとLinkListのように,集合キャリアとしてListインタフェースを実現しているが,その内部構造は異なり,ArrayListは配列によって実現され,LinkListはオブジェクトチェーンテーブルによって実現されている.
HashtableとDictionaryが同時に存在するため、使用シーンには必然的に選択性が存在し、いつでも互いに取って代わることができる.
[1]シングルスレッドプログラムではDictionaryの使用が推奨されており、汎用的な利点があり、読み取り速度が速く、容量利用がより十分である.[2]マルチスレッドプログラムではHashtableの使用が推奨されている.デフォルトのHashtableではシングルスレッド書き込み、マルチスレッド読み出しが許可されている.Hashtableに対してSynchronized()メソッドをさらに呼び出すと完全なスレッドセキュリティのタイプが得られる.Dictionaryはスレッドセキュリティではなく、lock文を人為的に使用する保護が必要となり、効率が大幅に低下する.[3]Dictionaryは挿入順にデータを並べる特性がある(注:ただしRemove()を呼び出してノードを削除すると順番が狂う)ため、順序を体現する必要がある状況でDictionaryを使用すると一定の便利さが得られる.
個人的にはDictionaryを使う傾向があります.汎用的で制御性が強いからです.いくつかの資料の中で、多くの人もDictionaryを使うことを推薦して、その原因は主にあります
1、Dicはタイプが安全で、より丈夫で読みやすいコードを書くのに役立ち、強制的に変換する手間を省くことができます.2、Dicは汎行であり、KまたはVが値タイプである場合、その速度はHashtableをはるかに上回る.オブジェクトの処理には明示的または暗黙的な変換は必要ありません.値タイプの処理には箱詰めは必要ありません.そのため、使いやすく、効率が高く(符号化効率、実行効率)、エラーが発生しにくい.
DictionaryがAddメソッドを呼び出す前にContainsKeyメソッドを使用してキーが存在するかどうかをテストします.そうしないと、KeyNotFoundExceptionが得られます.プログラムが辞書に存在しないキーを頻繁に試行する場合、TryGetValueメソッドを使用して値を取得する方法は、より効率的な値の取得方法です.
次に、遍歴、追加、削除など、Dictionaryの一般的な操作を示します.
Dictionary<int, string> dictionary = new Dictionary<int, string>();
dictionary.Add(1, "xiaowang");
dictionary.Add(21, "dsd");
dictionary.Add(33, "dsfdfd");
dictionary.Add(4, "liusang");
foreach (KeyValuePair<int, string> kvp in dictionary)
{
Console.WriteLine("key={0},value={1}", kvp.Key, kvp.Value);
}
foreach (int j in dictionary.Keys)
{
Console.WriteLine("key={0},value={1}", j, dictionary[j]);
}
if (dictionary.ContainsKey(2))
{
Console.WriteLine(dict[2]);
}
// Keys
foreach (var item in dictionary.Keys)
{
Console.WriteLine("Key:{0}", item);
}
// Values
foreach (var item in dictionary.Values)
{
Console.WriteLine("value:{0}", item);
}