1. ホーム
  2. c#

[解決済み] [Solved] .Net データ構造。ArrayList, List, HashTable, Dictionary, SortedList, SortedDictionary -- 速度、メモリ、そしてそれぞれを使うべきタイミングは?[クローズド]。

2022-04-07 21:37:34

質問

.NETには複雑なデータ構造がたくさんあります。残念ながら、中にはよく似たものもあり、いつ使って、いつ別のものを使うのか、いつもよくわからない。私が持っているC#やVBの本のほとんどは、それらについてある程度は触れていますが、本当の意味での詳細には触れていないのです。

Array、ArrayList、List、Hashtable、Dictionary、SortedList、SortedDictionaryの違いは何ですか?

列挙可能なものはどれか(IList -- 'foreach'ループが可能)?キーと値のペアを使うのはどれですか(IDict)?

メモリフットプリントはどうでしょうか?挿入速度は?検索速度は?

他に特筆すべきデータ構造はありますか?

メモリ使用量と速度(Big-O表記)の詳細については、まだ模索中です

どのように解決するのですか?

思いつくままに

  • Array * - 古いタイプのメモリー配列で、通常のメモリー配列の別名のようなものです。 type[] 配列になります。列挙できる。自動的には大きくならない。非常に高速な挿入・取り出し速度を想定している。

  • ArrayList - 自動生成される配列。より多くのオーバーヘッドを追加します。通常の配列より遅いかもしれませんが、それでもかなり速いです。これらは.NETで多く使われている。

  • List - ジェネリックスと一緒に使うことで、強く型付けされた配列を持つことができます。 List<string> . それ以外の動作は ArrayList

  • Hashtable - 古いハッシュテーブル。最悪の場合O(1)からO(n)です。valueとkeysのプロパティを列挙し、key/valのペアを作ることができる。

  • Dictionary - のように、ジェネリックスによって強く型付けされるだけで、上記と同じです。 Dictionary<string, string>

  • SortedList - ソートされた一般的なリストです。どこに何を入れるかを考えなければならないので、挿入時に遅くなる。enum.であれば、検索時に場所を特定する必要がないので同じでしょうが、削除は普通のリストより遅くなります。

を使うことが多いのですが ListDictionary 一度ジェネリックで強く型付けしたものを使い始めると、標準の非ジェネリックに戻るのは本当に難しいです。

他にもいろいろなデータ構造があります。 KeyValuePair を使うと、面白いことができます。 SortedDictionary というのも便利です。