Order-preserving data structures in C#
MSDN hat keine Informationen über die um der Erhaltung von Eigenschaften von Datenstrukturen. Also ich habe die Annahme, dass:
- HashTable und HashSet nicht Erhaltung der insertion order (d.h. die "hash" in es ist ein Werbegeschenk)
- Wörterbuch und Liste tun bewahren Sie die Einfügemarke um.
Aus diesem habe ich extrapolieren, dass wenn ich eine Dictionary<double, double> foo
definiert eine Kurve, die foo.Keys.ToList()
und foo.Values.ToList()
mir eine geordnete Liste der Anwendungsbereich und die Domäne, die Kurve, ohne in Unordnung zu mit es?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie NICHT erwarten, dass entweder der Schlüssel oder Werte in einem regulären
Dictionary<TKey,TValue>
gepflegt werden, in beliebiger Reihenfolge. In einemSortedDictionary<TKey,TValue>
die Schlüssel und Werte gepflegt werden, um durch den Wert des Schlüssel - das ist nicht das gleiche wie einfügen, um.Nur die built-in-Wörterbuch .NET framework, die die Beibehaltung einsetzen, um ist
System.Sammlungen.Spezialisierte.OrderedDictionary
. Leider ist diese Klasse nicht generisch - aber es ist nicht sehr schwer zu schreiben eine generische wrapper um ihn herum. Halten Sie im Verstand, beim Umgang mit Wert-Typen (wieint
oderdouble
) wird sich das Ergebnis im Boxen der Schlüssel/Werte (generische Wörterbücher nicht verhängen Boxen auf Wert-Typen).Als @Anton wies auf die
Dictionary<TKey,TValue>
ist eine ungeordnete collection. Die ordnungsgemäße Rücksendung Ihrer Werte ist Zufall und wird letztendlich scheitern. Wenn Sie brauchen, um eine geordnete Hash-Tabelle, die Sie verwenden solltenSortedDictionary<TKey,TValue>
SortedDictionary<TK,TV>
nicht bewahren einlegen, um es unterhält Elemente, basierend auf einer natürlichen Anordnung der Tasten. Es ist eine nicht-generischeOrderedDictionary
Klasse in derSystem.Collections.Specialized
namespace das nicht bewahren einlegen, um auf die Kosten von zusätzlichen Speicher. (Es ist im Grunde implementiert als hash-Tabelle und eine Liste).Mit allen Mitteln, verlassen Sie sich auf
Dictionary<TKey, TValue>
zu erhalten Bestellung!Während
Dictionary<TKey, TValue>
klar, dass die Aufzählung ist die Reihenfolge undefiniert, die wir getestet, dass es tatsächlich nicht erhalten Einfügung der Bestellung (zumindest solange Sie nicht entfernen Sie Elemente aus). Wenn jemand ein test widerlegt es, wären wir sehr interessiert, da unsere Produktion-code verlässt sich auf Sie.Könnten Sie nehmen den gleichen Ansatz, und Sie sparen sich einige Mühe und Ihren Kunden etwas Geld.
Sicher, könnte Microsoft das Wörterbuch ändern, eine Umsetzung in der Zukunft .NET-version, aber wenn das passiert, Ihre automatisierten test erkennt es, und Sie können Wörterbuch ersetzen, mit einem anderen container zu dieser Zeit, richtig?
Insert
Methode in Reflektor - er verwendet den Schlüssel, hash-code, um zu bestimmen, wo der Eintrag in der backing-arrays, und dann einfach durchläuft die arrays in therEnumerator
Dictionary
auf diese Weise zu Verhalten, die für mehr als nur ein Grenzfall. Tatsächlich gibt es zwei arrays. Eine für den eigentlichen gespeicherten Elemente (Einträge) und eine für den index in der ehemaligen (Eimer). Neue Elemente werden immer Hinzugefügt, um den nächsten verfügbaren Schlitz in der entry-array, unabhängig davon, was passiert mit dem hash-codes und die bucket-Arrays. Auch wenn Sie ein Element löschen, die Reihenfolge der array-Eintrag ist immer noch deterministisch (wenn auch nicht zeitlich mehr). Wieder, ich würde verlassen Sie sich nie auf dieses detail.OrderedDictionary
). Also ich glaube nicht, dass dies ist guter Rat für jemanden, der auf der Stufe der Gestaltung Ihrer software.exec proc @Param1, @Param2, etc.
stattexec proc @Param1Name=@Param1Value, @Param2Name = @Param2Value
, so waren die Werte übergeben werden, die durch position anstelle von Namen. Also ich bin wie, wie, zum Teufel, hat das schon funktioniert, es sei denn, Wörterbuch enumeration ist die Erhaltung einsetzen, um... das ist der einzige Weg, die Positionen weitergegeben werden konnten konsequent. Sicher genug, es FUNKTIONIERT!