HashSet<T>
とList<T>
.NETの違いは何ですか?
多分あなたはどのケースHashSet<T>
が好まれるべきかを例で説明できList<T>
ますか?
HashSet<T>
とList<T>
.NETの違いは何ですか?
多分あなたはどのケースHashSet<T>
が好まれるべきかを例で説明できList<T>
ますか?
回答:
リストとは異なり<> ...
HashSetは、重複するメンバーのないリストです。
HashSetは一意のエントリのみを含むように制限されているため、内部構造は検索用に最適化されています(リストと比較して)-かなり高速です
HashSetへの追加はブール値を返します-Setに既に存在するために追加が失敗した場合はfalse
セットに対して数学的なセット操作を実行できます:Union / Intersection / IsSubsetOfなど。
HashSetはICollectionのみを実装していないICollection
HashSetではインデックスを使用できません。列挙子のみを使用できます。
HashSetを使用する主な理由は、Set操作の実行に関心がある場合です。
与えられた2つのセット:hashSet1とhashSet2
//returns a list of distinct items in both sets
HashSet set3 = set1.Union( set2 );
LINQを使用する同等の操作と比較して飛ぶ。書くのもすっきり!
Union
方法に問題がありました。UnionWith
代わりに使っていました。
より正確には、例を使って説明しましょう。
次の例のように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
、UnionWith
、IsProperSubsetOf
、ExceptWith
、SymmetricExceptWith
など
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
A HashSet<T>
は、O(1)
包含のルックアップを提供するように設計されたクラスです(つまり、このコレクションには特定のオブジェクトが含まれており、すぐに答えを教えてください)。
A List<T>
は、O(1)
動的に成長できる(動的配列と考える)よりもランダムなアクセスのコレクションを提供するように設計されたクラスです。O(n)
時間内に包含をテストできます(リストがソートされていない限り、O(log n)
時間内にバイナリ検索を実行できます)。
多分あなたはどのケース
HashSet<T>
が好まれるべきかについての例で説明することができますList<T>
で封じ込めをテストする場合O(1)
。
次のList<T>
場合にaを使用します。
(アイテム自体の値ではなく)必要なアイテムのインデックスがわかっている場合、取得はO(1)
です。インデックスがわからない場合O(n)
は、ソートされていないコレクションの場合、アイテムの検索に時間がかかります。
次のHashset<T>
場合にaを使用します。
検索したいものの名前がわかっている場合、LookupはO(1)
(「ハッシュ」の部分です)。のような順序付けは維持されずList<T>
、重複を保存することもできません(重複を追加しても効果はありません。それが「セット」部分です)。
Hashset<T>
スクラブルのゲームでプレイされた単語が英語(または他の言語)で有効な単語であるかどうかを確認したい場合などに、aを使用する場合の例を示します。そのようなゲームのオンラインバージョンのすべてのインスタンスで使用されるWebサービスを構築したい場合は、さらに良いでしょう。
A List<T>
は、プレーヤーのスコアを追跡するスコアボードを作成するのに適したデータ構造です。
リストは順序付きリストです。です
HashSetはセットです。それ:
リストは、アイテムに追加、挿入、および削除できる配列のようなものであるかのように、コレクションにアクセスする場合に適しています。順序が重要ではないアイテムの「バッグ」のようにコレクションを扱いたい場合、またはIntersectWithやUnionWithなどの操作を使用して他のセットと比較したい場合、HashSetがより良い選択です。
リストは、配列とは異なり、エントリを追加および削除できるタイプTのオブジェクトの順序付けられたコレクションです。
メンバーを格納した順序でメンバーを参照し、アイテム自体ではなく位置でメンバーにアクセスするリストを使用します。
HashSetはディクショナリのようなもので、アイテム自体がキーであると同時に値でもあり、順序は保証されません。
オブジェクトがコレクション内にあることを確認したい場合はHashSetを使用します
List
順序は維持されます(つまり、物事が追加されたとき)が、アイテムを自動的に並べ替えることはしません。を呼び出す.Sort
か使用する必要がありSortedList
ます。
これらのデータ構造をデータ駆動型開発での実際の使用に適用する場合、HashSetは、データのクレンジングと移行のために、データアダプターソースに対するレプリケーションのテストに非常に役立ちます。
また、DataAnnotationsクラスを使用する場合は、クラスプロパティにキーロジックを実装し、HashSetを使用して(クラスター化されているかどうかにかかわらず)Naturalインデックスを効果的に制御できます。これは、List実装では非常に困難です。
リストを使用する強力なオプションは、DropDownListヘルパーのMVCビューにクラスのリストを送信したり、WebApiを介してJSON構成として送信したりするなど、ビューモデルの複数のメディアにジェネリックを実装することです。このリストにより、典型的なクラスコレクションロジックが可能になり、さまざまな媒体に対する単一のビューモデルを計算するためのより「インターフェース」のようなアプローチの柔軟性が維持されます。