Tableau associatif C#
J'ai utilisé une table de hachage, mais par nature, les tables de hachage ne sont pas ordonnées, et j'ai besoin de tout garder en ordre lorsque je les ajoute (parce que je veux les retirer dans le même ordre). Par exemple si je fais:
pages["date"] = new FreeDateControl("Date:", false, true, false);
pages["plaintiff"] = new FreeTextboxControl("Primary Plaintiff:", true, true, false);
pages["loaned"] = new FreeTextboxControl("Amount Loaned:", true, true, false);
pages["witness"] = new FreeTextboxControl("EKFG Witness:", true, true, false);
Et quand je fais un foreach, je veux pouvoir l'obtenir dans l'ordre de:
pages["date"]
pages["plaintiff"]
pages["loaned"]
pages["witness"]
Comment puis-je faire cela?
10 réponses
Je crois que. NET A le OrderedDictionary
classe pour faire face à cela. Ce n'est pas générique, mais il peut servir de substitut Hashtable décent-si vous ne vous souciez pas de la sécurité de type strict.
J'ai écrit un wrapper Générique autour de cette classe, que je serais prêt à partager.
Http://msdn.microsoft.com/en-us/library/system.collections.specialized.ordereddictionary.aspx
Modifier: LBushkin a raison - OrderedDictionary
on dirait qu'il fait l'affaire, mais d'une manière non générique. C'est drôle combien de collections spécialisées il y a qui n'ont pas d'équivalents génériques : ((il serait logique que Malfist change la réponse acceptée à celle de LBushkin.)
(je pensais que...). Net n'a rien intégré pour le faire.
, Fondamentalement, vous aurez besoin de garder un List<string>
ainsi que Dictionary<string,FreeTextboxControl>
. Lorsque vous ajoutez au dictionnaire, ajoutez la clé à la liste. Ensuite, vous pouvez parcourez la liste et trouvez les clés dans l'ordre d'insertion. Vous devrez faire attention lorsque vous supprimez ou remplacez des éléments.
Il N'y a pas de solution parfaite avant. net 4.0. Dans
Utilisez une SortedList Générique avec un type de clé entier et un type de valeur du type commun le plus dérivé de vos éléments. Définissez une valeur entière (I, disons) et lorsque vous ajoutez chaque élément à la SortedList, faites la clé i++, en incrémentant sa valeur au fur et à mesure. Plus tard, parcourez la propriété GetValueList de la liste triée. Cette propriété IList donnera vos objets dans l'ordre dans lequel vous les mettez en, parce qu'ils seront triés par la clé que vous avez utilisée.
Ce n'est pas rapide, mais plutôt bon et générique. Si vous voulez également accéder par clé, vous devez faire autre chose, mais je ne le vois pas dans vos besoins. Si vous n'êtes pas nouveau pour récupérer par clé, et que vous ajoutez des éléments dans l'ordre des clés afin que la collection n'ait pas àFaire son tri, c'est tout.
Dans . net 4.0 vous aurez le SortedSet générique de T , qui sera absolument parfait pour vous. Aucun compromis.
Utilisez la liste triée je pense que cela résoudra votre problème parce que L'objet SortedList conserve en interne deux tableaux pour stocker les éléments de la liste; c'est-à-dire un tableau pour les clés et un autre tableau pour les valeurs associées. Chaque élément est une paire clé / valeur accessible en tant qu'objet DictionaryEntry
SortedList sl = new SortedList ();
Foreach (DictionaryEntry x dans sl) {}
Utilisez le KeyedCollection
Sa base sous-jacente est une liste mais fournit une recherche de dictionnaire basée sur la clé. Dans ce cas, votre clé est les chaînes. Donc, tant que vous n'ajoutez pas la même clé deux fois, vous allez bien.
Comme le suggère Haxelit, vous pouvez dériver de KeyedCollection<TKey, TValue>
. Il utilise en fait une liste en dessous jusqu'à ce que vous atteigniez une certaine valeur de seuil, puis il maintient à la fois une liste et un dictionnaire. Si vous pouvez utiliser une fonction à dériver l'une de vos clés à partir d'une de vos valeurs, alors c'est une solution facile. Si non, alors il devient assez salissant.
Le meilleur moyen est d'utiliser les indexeurs C#. Il est configurable pour tout ce que nous aimons. Nous pouvons passer un int
, enum
, long
, double
ou quelque chose que nous aimons.
Il suffit de créer une classe et de lui donner des indexeurs et de configurer les paramètres d'entrée et de sortie. C'est un peu plus de travail mais je pense que c'est la seule bonne façon.
Veuillez consulter ce lien MSDN pour plus d'informations sur la façon de l'utiliser.
Voir les Indexeurs: http://msdn.microsoft.com/en-us/library/6x16t2tx.aspx
Une alternative consiste à conserver vos valeurs de clé ordonnées dans une structure ordonnée comme une liste, le reste étant toujours stocké dans un dictionnaire.
Ensuite, lorsque vous avez besoin d'accéder à vos données, parcourez simplement votre liste triée et interrogez votre dictionnaire en cours de route.
Regardez la liste triée http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx