182

HashSet<T>List<T>.NETの違いを説明できますか?

HashSet<T>たぶん、どのような場合に優先すべきかを例で説明できますList<T>か?

4

8 に答える 8

234

List<> とは異なり ...

  1. HashSet は、メンバーが重複していないリストです。

  2. HashSet は一意のエントリのみを含むように制限されているため、内部構造は (リストと比較して) 検索用に最適化されています - かなり高速です

  3. HashSet に追加するとブール値が返されます - Set に既に存在するために追加が失敗した場合は false

  4. Set に対して数学的集合操作を実行できます: Union/Intersection/IsSubsetOf など。

  5. HashSet は IList のみ ICollection を実装していません

  6. HashSet ではインデックスを使用できず、列挙子のみを使用できます。

HashSet を使用する主な理由は、Set 操作の実行に関心がある場合です。

与えられた 2 つのセット: hashSet1 と hashSet2

 //returns a list of distinct items in both sets
 HashSet set3 = set1.Union( set2 );

LINQ を使用した同等の操作と比較して飛ぶ。書き心地もすっきり!

于 2011-06-17T21:00:41.423 に答える
60

より正確に例を挙げて説明しましょう。

次の例のように HashSet を使用することはできません。

HashSet<string> hashSet1 = new HashSet<string>(){"1","2","3"};
for (int i = 0; i < hashSet1.Count; i++)
    Console.WriteLine(hashSet1[i]);

hashSet1[i]エラーが発生します:

タイプ 'System.Collections.Generic.HashSet' の式に [] を使用したインデックス作成を適用することはできません

foreach ステートメントを使用できます。

foreach (var item in hashSet1)
    Console.WriteLine(item);

重複したアイテムを HashSet に追加することはできませんが、List でこれを行うことができます。HashSet にアイテムを追加しているときに、アイテムが含まれているかどうかを確認できます。

HashSet<string> hashSet1 = new HashSet<string>(){"1","2","3"};
if (hashSet1.Add("1"))
   Console.WriteLine("'1' is successfully added to hashSet1!");
else
   Console.WriteLine("'1' could not be added to hashSet1, because it contains '1'");

HashSet には 、 、 、 などの便利な関数がIntersectWithいくつUnionWithIsProperSubsetOfありますExceptWithSymmetricExceptWith

IsProperSubsetOf:

HashSet<string> hashSet1 = new HashSet<string>() { "1", "2", "3", "4" };
HashSet<string> hashSet2 = new HashSet<string>() { "2", "4", "6", "8" };
HashSet<string> hashSet3 = new HashSet<string>() { "1", "2", "3", "4", "5" };
if (hashSet1.IsProperSubsetOf(hashSet3))
    Console.WriteLine("hashSet3 contains all elements of hashSet1.");
if (!hashSet1.IsProperSubsetOf(hashSet2))
    Console.WriteLine("hashSet2 does not contains all elements of hashSet1.");

UnionWith:

HashSet<string> hashSet1 = new HashSet<string>() { "3", "4" };
HashSet<string> hashSet2 = new HashSet<string>() { "2", "4", "6", "8" };
hashSet1.UnionWith(hashSet2); //hashSet1 -> 3, 2, 4, 6, 8

IntersectWith:

HashSet<string> hashSet1 = new HashSet<string>() { "3", "4", "8" };
HashSet<string> hashSet2 = new HashSet<string>() { "2", "4", "6", "8" }
hashSet1.IntersectWith(hashSet2);//hashSet1 -> 4, 8

ExceptWith:

 HashSet<string> hashSet1 = new HashSet<string>() { "1", "2", "3", "5", "6" };
 HashSet<string> hashSet2 = new HashSet<string>() { "1", "2", "3", "4" };
 hashSet1.ExceptWith(hashSet2);//hashSet1 -> 5, 6

SymmetricExceptWith:

 HashSet<string> hashSet1 = new HashSet<string>() { "1", "2", "3", "5", "6" };
 HashSet<string> hashSet2 = new HashSet<string>() { "1", "2", "3", "4" };
 hashSet1.SymmetricExceptWith(hashSet2);//hashSet1 -> 4, 5, 6

ちなみに、HashSets では順序は保持されません。この例では、要素「2」を最後に追加しましたが、2 番目の順序です。

HashSet<string> hashSet1 = new HashSet<string>() { "3", "4", "8" };
hashSet1.Add("1");    // 3, 4, 8, 1
hashSet1.Remove("4"); // 3, 8, 1
hashSet1.Add("2");    // 3, 2 ,8, 1
于 2014-02-24T13:51:41.273 に答える
53

AHashSet<T>は、コンテインメントのルックアップを提供するように設計されたクラスですO(1)(つまり、このコレクションに特定のオブジェクトが含まれているかどうか、答えをすばやく教えてください)。

Aは、動的に拡張できるランダム アクセスList<T>のコレクションを提供するように設計されたクラスです(動的配列を考えてください)。O(1)時間内に封じ込めをテストできますO(n)(リストがソートされていなければ、時間内に二分探索を実行できますO(log n))。

HashSet<T>たぶん、どのケースが優先されるべきかを例で説明できますList<T>

で封じ込めをテストしたい場合O(1)

于 2011-06-17T21:02:02.647 に答える
23

次の場合にa を使用しList<T>ます。

  • アイテムのコレクションを特定の順序で保存します。

(アイテム自体の値ではなく)必要なアイテムのインデックスがわかっている場合、検索はO(1). インデックスがわからない場合O(n)、並べ替えられていないコレクションの場合、アイテムを見つけるのに時間がかかります。

次の場合にa を使用しHashset<T>ます。

  • 特定のオブジェクトがコレクションに含まれているかどうかをすばやく確認します。

探したいものの名前がわかっている場合、ルックアップはO(1)(「ハッシュ」部分) です。のように順序を維持せずList<T>、重複を保存することはできません (重複を追加しても効果はありません。これが「セット」部分です)。

a を使用する例としてはHashset<T>、Scrabble のゲームで使用される単語が英語 (または他の言語) で有効な単語かどうかを調べたい場合があります。そのようなゲームのオンライン バージョンのすべてのインスタンスで使用される Web サービスを構築したい場合は、さらに良いでしょう。

AList<T>は、スコアボードを作成してプレーヤーのスコアを追跡するのに適したデータ構造です。

于 2011-06-17T21:11:30.250 に答える
16

リストは順序付きリストです。それは

  • 整数インデックスによるアクセス
  • 重複を含めることができます
  • 予測可能な順序を持っています

HashSet はセットです。これ:

  • 重複するアイテムをブロックできます ( Add(T)を参照)
  • セット内のアイテムの順序を保証するものではありません
  • IntersectWith、 IsProperSubsetOf、UnionWith など、セットに対して期待される操作があります。

リストは、アイテムを追加、挿入、および削除できる配列のようにコレクションにアクセスする場合に適しています。HashSet は、順序が重要ではない項目の「バッグ」のようにコレクションを扱いたい場合、または IntersectWith や UnionWith などの操作を使用して他のセットと比較したい場合に適しています。

于 2011-06-17T21:13:08.187 に答える
3

リストは必ずしも一意ではありませんが、ハッシュセットは一意です。

于 2011-06-17T21:00:39.150 に答える
3

List は、配列とは異なり、エントリを追加および削除できる T 型のオブジェクトの順序付けられたコレクションです。

メンバーを格納した順序で参照するリストを使用し、アイテム自体ではなく位置によってメンバーにアクセスします。

HashSet は、項目自体が値であると同時にキーである辞書のようなもので、順序は保証されません。

オブジェクトがコレクション内にあることを確認する場合は、HashSet を使用します。

于 2011-06-17T21:10:59.800 に答える