Frage

Wer weiß, ob es ein gutes Äquivalent zu Java Set Sammlung in C # ist? Ich weiß, dass Sie etwas ein Set imitieren eine Dictionary oder eine HashTable Verwendung von bevölkern, aber die Werte zu ignorieren, aber das ist nicht eine sehr elegante Art und Weise.

War es hilfreich?

Lösung

Versuchen Sie HashSet :

  

Die HashSet (Of T) -Klasse bietet High-Performance-Set-Operationen. Ein Set ist eine Sammlung, die keine doppelten Elemente enthält, und deren Elemente in keiner bestimmten Reihenfolge ...

     

Die Kapazität eines HashSet (Of T) -Objekt ist die Anzahl der Elemente, die das Objekt halten kann. Ein HashSet (Of T) Kapazität des Objekts automatisch erhöht als Element zum Objekt hinzugefügt werden.

     

Die HashSet (Of T) Klasse basiert auf dem Modell der mathematischen Sätze basieren und liefert High-Performance-Set Operationen ähnlich den Zugriff auf die Schlüssel der Dictionary (Of TKey, TValue) oder Hashtable Sammlungen. In einfachen Worten kann der HashSet (Of T) Klasse gedacht werden als Wörterbuch ( of TKey, TValue) Sammlung ohne Werte.

     

Ein HashSet (Of T) Sammlung nicht sortiert ist und keine doppelten Elemente enthalten kann ...

Andere Tipps

Wenn Sie .NET 3.5, verwenden, können Sie HashSet<T> . Es stimmt, dass .NET nicht für Sätze nicht gerecht sowie Java obwohl der Fall ist.

Die Wintellect PowerCollections helfen.

Die HashSet<T> Datenstruktur:

Die HashSet<T> Datenstruktur der Framework-Klassenbibliothek wurde in .NET Framework 3.5 eingeführt. Eine vollständige Liste der Mitglieder kann an dem MSDN Referenzseite für HashSet<T> .

HashSet<T> mehr oder weniger nach einer mathematischen Satz , was bedeutet, dass:

  1. Es kann keine doppelten Werte enthalten.

  2. Die Elemente in keiner bestimmten Reihenfolge sind; daher ist der Typ nicht die IList<T> Schnittstelle, aber je mehr Grund ICollection<T> . Als Folge Elemente innerhalb eines Hash-Sets nicht zufällig durch Indizes zugegriffen werden können; sie können nur durch eine enumerator iteriert werden.

  3. Bestimmte Satz Funktionen wie Union, Intersection, IsSubsetOf, IsSupersetOf stehen zur Verfügung. Diese können sich als nützlich, wenn Sie mit mehreren Datensätzen arbeiten.

Ein weiterer Unterschied zwischen HashSet<T> und List<T> ist, dass ein Hash-Set Add(item) Aufruf der Methode gibt einen Booleschen Wert. true, wenn das Element hinzugefügt wurde, und false sonst (weil es bereits in dem Satz gefunden wurde)

Warum nicht List<T>?

Da ein HashSet<T> ist einfach eine Sammlung von einzigartigen Objekten, könnte man sich fragen, warum es eine Datenstruktur sein muss. Ein normaler List<T> könnte das gleiche Verhalten, indem geprüft wird, ob ein Objekt in der Liste gefunden wird, bevor sie hinzugefügt wird.

Die kurze Antwort ist die Geschwindigkeit. Die Suche in einem normalen List<T> wird sehr langsam sehr schnell, da mehr Elemente hinzugefügt werden. Ein HashSet<T> erfordert ein Struktur-Design, das für die schnelle Suche und Vorschubgeschwindigkeiten ermöglicht.

Benchmarks:

Wir wollen die Leistung Geschwindigkeit eines HashSet<T> im Vergleich zu einem List<T> vergleichen.

Jeder Versuch bestand aus ganzen Zahlen von 0 bis 9.999 zu jeder Sammlung hinzufügen. Jedoch mod 25 wurde auf jede ganze Zahl angewendet. 25 Mod macht die maximalen Elementtypen 25. Da 10.000 Elemente hinzugefügt wurden, dies 400 Kollisionen gezwungen auftreten, die Datenstrukturen eine Chance zu geben, ihre Suchalgorithmen zu verwenden. Zeiten wurden 3 Mal nach 10.000 Studien und ausgemittelt.

Sie zu viel Aufmerksamkeit auf die spezifischen Laufzeiten der Tests nicht bezahlen, da sie auf meiner Hardware abhängig sind, sondern schauen, wie sie miteinander zu vergleichen.

           Average time [ms]
----------------------------
HashSet<T>             2,290
List<T>                5,505

Lassen Sie uns jetzt Elemente machen Objekte anstelle von primitiven Typen. Ich schrieb eine schnelle Person Klasse mit drei Feldern: Name, LastName und ID. Da ich keine spezifische Art und Weise enthalten war, um Objekte zu vergleichen, alle Elemente werden ohne Kollisionen hinzugefügt werden. Dieses Mal 1000 Person Objekte wurden für eine einzige Studie zu jeder Sammlung hinzugefügt. Die Gesamtzeiten von 3 Sätzen von 1.000 Studien wurden ausgemittelt.

           Average time [ms]
----------------------------
HashSet<Person>          201
List<Person>           3,000

Wie Sie sehen können, ist der Unterschied in Laufzeiten astronomische wird, wenn Objekte mit, so dass die HashSet<T> vorteilhaft.

Wenn Sie .NET 4.0 oder höher verwenden:

Für den Fall, Sie brauchen Sortierung dann verwenden SortedSet<T> . Andernfalls, wenn Sie nicht, dann verwenden Sie HashSet<T> da es O(1) für Such- und Operationen manipulieren. Während SortedSet<T> ist O(log n) für die Suche und Operationen bearbeiten.

Ich verwende Iesi.Collections http://www.codeproject.com/KB/recipes /sets.aspx

Es ist in vielen OSS-Projekten verwendet wird, habe ich über sie in NHibernate kam zuerst

Ich benutze einen Wrapper um einen Dictionary<T, object>, nulls in den Werten zu speichern. Dies gibt O (1) hinzufügen, Lookup und entfernen Sie auf die Tasten, und alle Absichten und Zwecke wirkt wie ein Satz.

Hier finden Sie aktuelle PowerCollections über auf CodePlex. Neben Set und OrderedSet es noch ein paar andere nützliche Sammlung Typen hat wie Deque, Multidictionary, Tasche, OrderedBag, OrderedDictionary und OrderedMultiDictionary.

Für weitere Sammlungen, gibt es auch die C5 Allgemein Sammlung Bibliothek .

Sie können Ihre eigene tragfähige Satz Implementierung in ein paar Stunden implementieren. Ich habe, als ich es zu tun hatte (sorry, ich habe nicht den Code zur Hand): http://java.sun.com/j2se/1.4.2/docs/api/java/util/Set.html

Ich weiß, das ist ein alter Thread, aber ich wurde in das gleiche Problem laufen und fand HashSet sehr unzuverlässig zu sein, weil die gleichen Samen gegeben, GetHashCode () verschiedene Codes zurückgegeben. So, dachte ich, warum nicht nur eine Liste verwenden und die Add-Methode wie folgt verbergen

public class UniqueList<T> : List<T>
{
    public new void Add(T obj)
    {
        if(!Contains(obj))
        {
            base.Add(obj);
        }
    }
}

Da Liste verwendet die Equals-Methode allein Gleichheit zu bestimmen, können Sie die Equals-Methode auf Ihrem T-Typ definieren, um die gewünschten Ergebnisse stellen Sie sicher, erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top