回答:
HashSetを試してください:
HashSet(Of T)クラスは、高性能のセット操作を提供します。セットは、重複する要素を含まないコレクションであり、その要素は特定の順序ではありません...
HashSet(Of T)オブジェクトの容量は、オブジェクトが保持できる要素の数です。要素がオブジェクトに追加されると、HashSet(Of T)オブジェクトの容量は自動的に増加します。
HashSet(Of T)クラスは数学セットのモデルに基づいており、Dictionary(Of TKey、TValue)またはHashtableコレクションのキーにアクセスするのと同じような高性能のセット操作を提供します。簡単に言えば、HashSet(Of T)クラスは、値のないDictionary(Of TKey、TValue)コレクションと考えることができます。
HashSet(Of T)コレクションは並べ替えられておらず、重複する要素を含めることはできません...
.NET 3.5を使用している場合は、を使用できますHashSet<T>
。.NETがJavaのようにセットに対応していないのは事実です。
WintellectのPowerCollectionsはあまりにも役立つかもしれません。
.NET 4.0以降を使用している場合:
並べ替えが必要な場合は、を使用してくださいSortedSet<T>
。そうでない場合は、検索と操作の操作HashSet<T>
のO(1)
ために使用します。一方SortedSet<T>
でO(log n)
、検索用と操作を操作します。
Iesi.Collections http://www.codeproject.com/KB/recipes/sets.aspxを使用しています
それは多くのOSSプロジェクトで使用されています、私は最初にNHibernateでそれを見つけました
の周りにラッパーを使用Dictionary<T, object>
して、値にnullを格納します。これにより、O(1)にキーの追加、検索、削除が行われ、すべての意図と目的に対して、セットのように機能します。
CodePlex でPowerCollectionsをご覧ください。SetとOrderedSetの他に、Deque、MultiDictionary、Bag、OrderedBag、OrderedDictionary、OrderedMultiDictionaryなどの便利なコレクションタイプがいくつかあります。
その他のコレクションについては、C5 Generic Collection Libraryもあります。
これは古いスレッドであることはわかっていますが、同じ問題が発生していて、同じシードを指定するとGetHashCode()が異なるコードを返すため、HashSetは非常に信頼できないことがわかりました。だから、私は、なぜリストを使用して、このようなaddメソッドを非表示にしないのかと思いました
public class UniqueList<T> : List<T>
{
public new void Add(T obj)
{
if(!Contains(obj))
{
base.Add(obj);
}
}
}
ListはEqualsメソッドを使用して等しいかどうかを判断するだけなので、T型にEqualsメソッドを定義して、目的の結果を確実に得ることができます。
List.Contains
は、がO(n)
複雑であるため、Add
メソッドも複雑になるためですO(n)
。インナーコレクションと仮定すると、サイズを変更する必要はありませんAdd
両方のためにList
とHashMap
のものでなければならないO(1)
複雑。TLDR:これは機能しますが、ハックで効率が落ちます。