HashSet C#HashSetデータ構造は、.NET Framework 3.5で導入されました。実装されているメンバーの完全なリストは、HashSet MSDNページにあります。
- どこで使用されていますか?
- なぜそれを使いたいのですか?
HashSet C#HashSetデータ構造は、.NET Framework 3.5で導入されました。実装されているメンバーの完全なリストは、HashSet MSDNページにあります。
回答:
Aは、HashSet
オブジェクトのセットを保持しているが、方法で、それはあなたが簡単かつ迅速にオブジェクトがすでにセットであるかどうかを判断することを可能にすること。これは、配列を内部的に管理し、オブジェクトのハッシュコードから計算されたインデックスを使用してオブジェクトを格納することによって行われます。ここを見てください
HashSet
一意の要素を含む順不同のコレクションです。標準のコレクション操作Add、Remove、Containsがありますが、ハッシュベースの実装を使用しているため、これらの操作はO(1)です。(たとえば、リスト(ContainsとRemoveのO(n)とは対照的です)HashSet
とは異なります。)は、union、intersection、symmetric differenceなどの標準のセット操作も提供します。ここを見てください
セットにはさまざまな実装があります。いくつかは、要素をハッシュすることによって挿入と検索操作を超高速にします。ただし、これは、要素が追加された順序が失われることを意味します。他の実装では、実行時間が長くなる代わりに、追加された順序が保持されます。
HashSet
C#のクラスは最初のアプローチに使用されるため、要素の順序は保持されません。通常よりはるかに高速ですList
。いくつかの基本的なベンチマークは、プライマリタイプ(int、double、boolなど)を処理するときにHashSetがかなり高速であることを示しました。クラスオブジェクトを操作する場合は、はるかに高速です。つまり、HashSetは高速です。
唯一の欠点はHashSet
、インデックスによるアクセスがないことです。要素にアクセスするには、列挙子を使用するか、組み込み関数を使用してHashSet
をに変換し、List
それを繰り返します。ここを見てください
A HashSet
には内部構造(ハッシュ)があり、アイテムをすばやく検索して識別できます。欠点は、HashSet
(またはインデックスによる項目の取得)がかなり遅いことです。
では、なぜエントリがセットに既に存在するかどうかを誰かが知りたいのでしょうか?
a HashSet
が役立つ1つの状況は、重複が存在する可能性があるリストから個別の値を取得する場合です。アイテムがアイテムに追加されるHashSet
と、アイテムが存在するかどうかをすばやく判断できます(Contains
演算子)。
他の利点は、HashSet
Set操作です: IntersectWith
、IsSubsetOf
、IsSupersetOf
、Overlaps
、SymmetricExceptWith
、UnionWith
。
オブジェクト制約言語に精通している場合は、これらの集合演算を特定します。また、実行可能なUMLの実装に一歩近づいていることもわかります。
簡単に言うと、キッチンの秘密を明かす
ことはありません。一般に、セットは、重複する要素を含まないコレクションであり、その要素には特定の順序はありません。したがって、A HashSet<T>
はgeneric List<T>
に似ていますが、順序を失うことを犠牲にして(名前が示すようにハッシュテーブルを介して)高速ルックアップ用に最適化されています。