Sortieren eines ConcurrentDictionary nach Wert

8

Ich kann mein ConcurrentDictionary nach Wert wie folgt sortieren:

%Vor%

Was großartig ist, außer, dass ich diese neue nachgeordnete Liste als das Wörterbuch einstellen möchte, indem ich das Wörterbuch selbst sortiere, anstatt nur eine Ergebnisliste von sortierten Artikeln zu erhalten.

Ich versuche so etwas zu machen, hatte aber kein Glück - das Wörterbuch ist nach wie vor ungeordnet:

%Vor%

Es scheint so zu sein, dass dies keine Auswirkungen auf das Wörterbuch hat. Ich habe auch versucht, das OrderBy-Ergebnis zu einer neuen Var zu transformieren, wobei ich dachte, dass es sich auf den Delegierten auswirken könnte, aber immer noch kein Glück.

Wie kann ich dieses ConcurrentDictionary neu ordnen und dann das Wörterbuch dazu zwingen, das umgeordnete Ergebnis von OrderBy zu sein?

    
user1111380 22.12.2011, 19:25
quelle

5 Antworten

6

Einfache Wörterbücher sind keine sortierten Sammlungen. Sie sind lediglich eine Sammlung, die Schlüssel zu Werten abbildet. ConcurrentDictionary ist nicht anders.

Sie benötigen stattdessen SortedConcurrentDictionary (ähnlich wie SortedDictionary ), Diese Datenstruktur existiert jedoch nicht.

Wenn Sie tatsächlich ein sortiertes "Wörterbuch" benötigen, müssen wir mehr über Ihren Anwendungsfall erfahren. Ist das eine Warteschlange mit falscher Priorität? Könnten Sie einfach eine ConcurrentBag<Proxy> verwenden und nach der Tat eine Bestellung ausführen?

Wenn Sie die Sammlung und in einer nachgeschalteten parallelen Methode die Proxies in sortierter Reihenfolge verwenden müssen, schlage ich vor, einen Blick auf die Erstellung eines benutzerdefinierte Partitionierer , die möglicherweise aus dem MSDN-Beispiel eines OrderablePartitioner .

    
user7116 22.12.2011, 19:33
quelle
2

Ein Wörterbuch, insbesondere ConcurrentDictionary, ist im Wesentlichen unsortiert.

Wenn Sie eine sortierte Auflistung benötigen, müssen Sie die Werte in einem anderen Typ speichern, z. B. in SortedDictionary<T,U> .

    
Reed Copsey 22.12.2011 19:28
quelle
2

Die Lösung besteht darin, ein SortedSet<T> zu verwenden, das nach vielen Stunden der Recherche und Code-Überarbeitung gefunden wurde. Ein sortierter Satz bietet die Eindeutigkeit eines Dictionary oder HashSet , erlaubt aber auch das Sortieren - weder ein Dictionary noch ein HashSet erlauben das Sortieren.

    
user1111380 23.12.2011 05:39
quelle
1

Vielleicht nicht effizient, wenn Sie es oft in einer unveränderlichen Klasse nennen, aber einfach:

%Vor%     
smirkingman 17.11.2012 21:05
quelle
0

ConcurrentDictionary , genau wie Dictionary , kennt das Sortierkonzept nicht, d. h. es enthält keine Bestellinformationen. Das Ergebnis von OrderBy() hat eine bestimmte Reihenfolge, aber wenn es Proxies zugewiesen wird, geht die Bestellungsinformation verloren.

Beachten Sie, dass es sortierte Implementierungen von IDictionary , nämlich SortedDictionary und SortedList , gibt.

    
Dennis Traub 22.12.2011 19:28
quelle