Tri d'une ConcurrentDictionary en Valeur
Je suis en mesure de faire le tri dans mes ConcurrentDictionary en valeur de la sorte:
static ConcurrentDictionary<string, Proxy> Proxies =
new ConcurrentDictionary<string, Proxy>();
Proxies.OrderBy(p => p.Value.Speed);
Qui est très bien, sauf que je veux mettre ce nouveau réaménagement des la liste, dictionnaire, permettant ainsi de trier le dictionnaire lui-même plutôt que de simplement recevoir une liste d'éléments triés.
J'essaie de faire quelque chose comme ça, mais n'avait pas de chance - le dictionnaire est toujours non ordonnée après:
Proxies = new ConcurrentDictionary<string,Proxy>(
Proxies.OrderBy(p => p.Value.Speed));
Il semble que le faire n'a pas d'effet sur le dictionnaire. J'ai aussi essayé le casting du OrderBy suite à une nouvelle var en pensant que cela peut avoir un effet sur le délégué, mais toujours pas de chance.
Comment puis-je re-commander ce ConcurrentDictionary et puis forcer le dictionnaire pour la re-commandé le résultat de OrderBy?
OriginalL'auteur user1111380 | 2011-12-22
Vous devez vous connecter pour publier un commentaire.
Simple, les dictionnaires ne sont pas des collections triées. Ils ne sont qu'une collection de cartes des clés à des valeurs.
ConcurrentDictionary
n'est pas différent.Vous avais plutôt besoin d'un
SortedConcurrentDictionary
(à l'instar deSortedDictionary
), cependant, cette structure de données n'existe pas.Si vous avez réellement besoin d'un triées "dictionnaire", nous avions besoin d'entendre plus au sujet de votre cas d'utilisation. Est-ce une fausse file d'attente de priorité? Pourriez-vous simplement d'utiliser un
ConcurrentBag<Proxy>
et effectuer la commande après le fait?Si vous avez besoin de prendre de la collection et en aval méthode en parallèle utiliser les doublures dans l'ordre de tri, je suggère de jeter un oeil à la création d'un outil de Partitionnement personnalisé, potentiellement, des emprunts auprès de la MSDN exemple d'un OrderablePartitioner.
Il semble donc qu'il vous fallait un simultanées
HashSet
, qui leConcurrentBag
n'est pas que vous l'avez trouvé. Est-ce simultanées car un autre thread par jour?Rgiht, je suis en utilisant plusieurs threads pour vérifier que les formulaires de procuration et de mise à jour de la liste en conséquence.
Juste pour que personne d'autre ne passe 2 heures à la mise en œuvre d'un HashSet<T>, et puis une Liste<T> agir comme le "triés spectateur": .NET 4.0 ajout d'une SortedSet<T>', qui est un triées HashSet. /smash-visage-sur-clavier
Je suis en core 2.2 également à l'aide d'un concurrentdictionary pour les threads aspects, j'ai mis de l'enregistrement, de chargement et d'accès qui vérifie la liste est dans l'ordre que j'attends (une itération sur chaque élément). Pas parfait, mais il semble montrer que l'ordre de chargement est la façon dont il reste a persisté.
OriginalL'auteur user7116
Un dictionnaire, surtout ConcurrentDictionary, est essentiellement non triés.
Si vous avez besoin d'une collection triée, vous aurez besoin de stocker les valeurs dans un autre type, tel qu'un
SortedDictionary<T,U>
.Juste être prudent - commande et les collections simultanées généralement conflit... en général, (si c'est possible) c'est une bonne idée de garder vos données en même temps une collection tout en travaillant sur elle, puis d'en extraire les éléments dans un ordre spécifique pour présenter les résultats, etc.
Mais la récupération des éléments dans un ordre donné, là où le travail avec la collection est plus de lecture que d'écriture intensive peuvent être assez coûteux. Je vois un cas de vouloir mettre à jour un ConcurrentDictionary et ont le tri des articles atomiquement le cadre de la mise à jour. Plutôt que d'avoir à réinitialiser la totalité du Dictionnaire dans l'ordre de tri désiré. À cette fin, ConcurrentSortedDictionary ou SortedConcurrentDictionary sera agréable d'avoir de la BCL.
OriginalL'auteur Reed Copsey
La solution est d'utiliser un
SortedSet<T>
, découvert après de nombreuses heures de recherche et de révision du code. Un ensemble trié offre l'unique-ness deDictionary
ouHashSet
, mais permet également de tri - ni unDictionary
ni unHashSet
permettre le tri.OriginalL'auteur user1111380
Peut-être pas efficace si vous l'appelez souvent dans une immuable de la classe, mais simple:
Vous avez tout à fait raison, comme je l'ai dit, "Peut-être pas efficace". Une version plus sophistiquée serait de cache et actualiser le cache lors de la ditionary est changé.
OriginalL'auteur smirkingman
ConcurrentDictionary
, tout commeDictionary
, ne connaissent pas la notion de tri, c'est à dire qu'il ne contient aucune information de commande. Le résultat deOrderBy()
a un ordre spécifique, mais lorsqu'ils sont affectés àProxies
l'ordre de l'information est perdue.Noter qu'il y a trié les implémentations de
IDictionary
, à savoirSortedDictionary
etSortedList
.OriginalL'auteur Dennis Traub