Comment insérer comme premier élément dans le dictionnaire?
J'ai un dictionnaire de la structure, avec de multiples paires clé-valeur à l'intérieur.
myDict.Add(key1, value1);
myDict.Add(key2, value2);
myDict.Add(key3, value3);
Mon dictionnaire est utilisé comme source de données pour un certain contrôle. Dans le contrôle de liste déroulante, je vois les articles sont comme ceci:
key1
key2
key3
La commande ressemble à mon dictionnaire.
Je sais que le Dictionnaire n'est pas comme arrayList - vous pouvez obtenir l'indice.
Je ne peux pas utiliser sortedDictionary.
Maintenant, j'ai besoin d'ajouter une autre valeur de la clé de la paire à ce dictionnaire à un certain point de mon programme et j'espère que cela a le même effet que je fais ceci:
myDict.Add(newKey, newValue);
myDict.Add(key1, value1);
myDict.Add(key2, value2);
myDict.Add(key3, value3);
Si je fais cela, je sais newKey affiche dans mon contrôle comme premier élément.
J'ai une idée pour créer un tempDict, mettre chaque paire dans myDict à tempDict, puis désactivez myDict, puis ajouter les paires de retour comme ceci:
myDict.Add(newKey, newValue);
myDict.Add(key1, value1);
myDict.Add(key2, value2);
myDict.Add(key3, value3);
Est-il mieux que cela?
Merci!
OriginalL'auteur spspli | 2011-09-22
Vous devez vous connecter pour publier un commentaire.
Dictionnaire<K,V>
ne pas ont une commande. Toute perception de maintien de l'ordre est par hasard (et un artefact d'une mise en oeuvre particulière, y compris, mais non limité à, un seau de sélection de commande et de comptage).Ce sont les approches (juste en utilisant le Classe de Base des Bibliothèques BCL), je sais à propos de:
Recherche<K,V>
OrderedDictionary
O(n)
pour "get(clé)/série(clé)")List<KeyValuePair<K,V>>
Heureux de codage.
La création d'un hachage de la structure des données qui maintient l'ordre d'insertion est en fait seulement une légère modification d'une norme de hachage de mise en œuvre (Ruby hachages maintenant de maintenir l'ordre d'insertion); toutefois, cela n'a pas été fait dans la .NET, ni, plus important encore, est-elle partie du Dictionnaire/IDictionary contrat.
Depuis gérer une touche unique à plusieurs valeurs, il est possible de conduire à des situations pas possible avec un dictionnaire. Le libellé n'était pas idéal.
+1 pour cette excellente réponse
OriginalL'auteur
Vous ne pouvez pas le faire avec le
Dictionary
classe. C'est en travaillant dans votre exemple en raison d'une bizarrerie dans la façon dont la structure de données est mis en œuvre. La structure de données stocke en fait les entrées dans l'ordre temporel dans un tableau et utilise ensuite un autre tableau à l'index dans l'entrée de gamme. Les énumérations sont fondées sur l'entrée de gamme. C'est pourquoi il semble être commandés dans votre cas. Mais, si vous appliquez une série d'insertion et le retrait des opérations, vous remarquerez cette commande obtient perturbé.Utilisation KeyCollection à la place. Il fournit O(1) la récupération par les deux clés et index et préserve l'ordre temporel.
Je n'ai aucune idée...bonne question.
+1 KeyedCollection c'est exactement ce que je cherchais!
OriginalL'auteur Brian Gideon
À partir de la page MSDN sur Dictionnaire(TKey, TValue):
Je suis en supposant que vous ne pouvez pas utiliser SortedDictionary parce que le contrôle dépend de votre source de données étant un Dictionnaire. Si le contrôle s'attend à la fois le type de Dictionnaire et de trier les données, le contrôle doit être modifié, car ces deux critères se contredisent l'une l'autre. Vous doit utiliser un type de données différent si vous avez besoin de tri ou de classement de la fonctionnalité. Selon un comportement indéfini est d'avoir des ennuis.
OriginalL'auteur Jim Dagg
Ne pas utiliser un dictionnaire - il n'y a pas de garantie de l'ordre des clés ne sont pas modifiées lorsque vous ajoutez de nouveaux éléments. Au lieu de cela, définir une classe
Pair
pour votre Clé-Valeur-Paires (voir ici Qu'est-ce que C# analogique de C++ std::pair? pour un exemple) et d'utiliser unList<Pair>
pour votre source de données. LeList
a unInsert
opération que vous pouvez utiliser pour insérer de nouveaux éléments n'importe où dans votre liste.ce que le bon médecin est de dire, c'est que vous ne devez pas ignorer les principes de base de
Dictionary<K,T>
. Donc, soit vous changez la structure de données ou de vivre avec une collection non ordonnée.Lorsque vous souhaitez que votre contrôle pour afficher des éléments dans un spécifiques, sous forme de liste de l'ordre, et le seul autorisé source de données est un dictionnaire qui n'est pas de fournir un ordre spécifique - alors ton contrôle est misdesigned et vous ne pouvez pas vous attendre à trouver une solution à votre problème. Donc, soit vous changez de contrôler, d'utiliser un autre contrôle ou pour en savoir davantage au sujet de votre contrôle si il existe un autre moyen d'obtenir les informations de commande à partir de quelque part à l'extérieur.
Est-ce que votre contrôle besoin d'un Dictionnaire<,> ou un IDictionary<,>? Si ce dernier, alors vous pouvez mettre en œuvre la IDictionary<,> interface autour de la Liste<Paire> ou de toute autre insertion-commandé solution que vous le souhaitez.
OriginalL'auteur Doc Brown
Dictionnaire ne Doit pas être utilisé pour trier des objets, il devrait plutôt être utilisée pour rechercher des objets. je suggère quelque chose d'autre si vous voulez l'avoir trier les objets trop.
Si vous développez le Dictionnaire, il n'y a aucune règle qui allait l'empêcher de mélanger votre Liste.
OriginalL'auteur Delusional Logic