Set
C#に Java のコレクションに相当するものがあるかどうかは誰にもわかりませんか? Dictionary
aまたは aを使用して値を入力するが無視することで、セットをいくらか模倣できることは知っていますがHashTable
、それはあまりエレガントな方法ではありません。
7 に答える
.NET 3.5 を使用している場合は、HashSet<T>
. .NET が Java のようにセットに対応していないことは事実です。
Wintellect PowerCollectionsも役立つ場合があります。
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 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もあります。
これが古いスレッドであることは知っていますが、同じ問題に遭遇していて、HashSet が非常に信頼できないことがわかりました。これは、同じシードを指定すると、GetHashCode() が異なるコードを返すためです。だから、なぜ List を使用して、このように add メソッドを非表示にしないのかと思いました
public class UniqueList<T> : List<T>
{
public new void Add(T obj)
{
if(!Contains(obj))
{
base.Add(obj);
}
}
}
List は Equals メソッドのみを使用して等しいかどうかを判断するため、T 型で Equals メソッドを定義して、目的の結果が確実に得られるようにすることができます。