Schnellste und effizienteste collection-Typ in C#
Ich Baue eine Anwendung, die erfordert eine Kollektion, die halten ca 10k von Strings.
Sammlung wird als Warteschlange.
So war auf der Suche durch die verschiedenen collection-Typen in C#, konnte aber nicht herausfinden, welche hat die beste Leistung in Bezug auf Geschwindigkeit zu tun, Put-und Get-operation in der Warteschlange. Auch sollte in der Lage sein nicht, so dass Duplikate in der Warteschlange/Sammlung.
BEARBEITEN, basierend auf die Kommentare..
Vorhandene Sammlung hilfreich sein wird. Oder eine benutzerdefinierte Sammlung könnte aus durchführen jede bestehende Sammlung wird groß sein.
Dank
- wie wäre es mit einem array als fifo?
- Gedanken über die ArrayList, aber Sie führen Sie sehr schlecht auf der Suche vs-Wörterbuch, die sehr gut bei der Durchführung der Suche, aber Sie erfordern viel mehr Ressourcen und Zeit put und get....
- Wenn es eine wäre, schnellsten collection, alles andere wäre sinnlos 🙂 Bitte sagen Sie uns, wenn Sie einen brauchen, der schnell zum einfügen neuer Elemente, oder einen, der schnell zu Lesen (wenn du nur bauen es einmal und nur von Ihr Lesen, das macht einen großen Unterschied). Außerdem ist die Speicherauslastung ein problem? Wie lange sind die Saiten?
- Es ist eine unsinnige Frage. Es deutet darauf hin, dass es etwas falsch mit Queue<> aber sagt nie was. Wenn es einen besseren Weg, um zu implementieren eine queue, dann ist natürlich der .NET framework-Programmierer würde es benutzt haben. Man kann nicht einen besseren job machen, nur noch schlimmer.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es die OrderedDictionary Klasse, die hält die Einfügung bestellen, aber können Sie look-up-Werte von Schlüssel.
Wenn Sie auf der Suche für Hohe Leistung Stellen & Holen Sie sich während der Prüfung für Einzigartigkeit (Dublettenprüfung) aber die Reihenfolge spielt keine Rolle (keine Warteschlange), dann verwenden Sie
HashSet<T>
Wenn Queue-feature ist mehr wichtig, dann verwenden Sie eine
Queue<T>
Ich glaube nicht, dass es etwas gibt, was beides anbieten.
Tun Sie etwas dagegen, die Ausgaben O(2n) Speicher? Man könnte eine Queue<> in Kombination mit einem Dictionary<,>. Die Warteschlange umgehen würden, queue und dequeue-Operationen und das Wörterbuch wäre sicherzustellen, dass eindeutige Einträge. Eine einfache wrapper-Klasse, könnte die Kombination dieser beiden, und es würde Ihnen, O(log n) queue und dequeue-Zeiten.
Beispiel:
Einem insert in diese benutzerdefinierte Daten-Struktur prüfen, ob das Wörterbuch enthält bereits das Element. Dieser Vorgang verwendet die ContainsKey-Methode ist eine O(log n) - operation. Wenn das Element bereits enthalten ist die Datenstruktur, die als die Methode beendet. Wenn das Element nicht enthalten, wird das Element eingefügt werden, in die Warteschlange, die eine Konstante O(1) - operation. Es wird auch dem Wörterbuch Hinzugefügt. Wenn die Zählung des Wörterbuchs ist weniger als die Kapazität, für die dieser Ansatz wird eine Konstante, O(1) einfügen Zeit als gut. Die gesamte Warteschlange Zeit werden daher in O(log n).
Das selbe gilt für das abarbeiten der Warteschlange Methode.
Diese Lösung ist im Grunde das gleiche wie die eingebaute Datenstruktur OrderedDictionary, da diese Lösung verwendet das generische es gibt keinen overhead im boxing/unboxing in Operationen machen es wastely schneller.
efficient
Wort von deiner Frage.HashSet<>
statt derDictionary<>
. Wie der boxing/unboxing: Er ist mit strings, so gibt es keine Boxen beteiligt. Normalerweise versuche ich, zu bleiben, um Rahmen von Daten-Strukturen-wenn möglich - hat jemand schon geschrieben, der code und es getestet - es sei denn, es ist ein nachgewiesener Vorteil von Rollen Ihrer eigenen Umsetzung.