8
votes

Liste de garde de KeyValuePairs?

Y a-t-il une collection en .NET qui permet de stocker keyvaluepair qui conserve l'ordre d'insertion?
Commandé par ordre semblait prometteur, mais semble faire plutôt défaut.
Maintenant, je cherche à IOPERDEDENMERABLE>, mais je ne peux pas sembler trouver une mise en œuvre, à l'exception de l'isorteddicary, mais ce n'est pas ce que je veux. Aucun tri doit être fait, l'ordre de l'insertion est important.

mise à jour
La raison pour laquelle je n'aime pas que la commande ordonnée soit que ce n'est pas générique.


3 commentaires

La commandeDdiconary ne trie pas les valeurs et vous pouvez accéder aux éléments par l'index. Qu'est-ce qui manque exactement?


CommandéDdicary est destiné à ce que vous recherchez, malheureusement, ce n'est pas générique. Au-delà, y a-t-il quelque chose d'autre que vous recherchez? Vous obtiendrez de meilleures réponses si vous pouvez clarifier ce que vous recherchez (et pourquoi les classes intégrées ne répondent pas à vos besoins).


Je voudrais échapper à tout le casting si possible.


5 Réponses :


8
votes

Il suffit d'utiliser Liste > code>. Ils sont stockés par ordre d'insertion. Chaque fois que vous l'ajoutez, le plus récent est ajouté à la fin de la liste.

SO P>

foreach(var item in list){
...}


3 commentaires

Est-il garanti que la liste garde la commande?


Oui, il faut, car vous pouvez accéder aux éléments directement comme si vous faites une liste de matrices [0] .. etc.


Ancien poste, mais pour les autres liste garde la commande aussi longtemps que vous ne triez pas explicitement. De plus, votre Supprimer changera l'indexation..Albe décalage du retiré



3
votes

Vous voudrez peut-être rouler un à l'aide d'une file d'attente où T est un keyvaluepair . C'est un contrat plus solide qui garantit explicitement l'ordre d'insertion.

http://msdn.microsoft.com/en-us/library /79777EY2C.aspx


0 commentaires

0
votes

Vous devriez simplement être capable d'utiliser une liste > . Je ne peux pas découvrir dans la documentation MSDN indiquant que l'ordonnance d'insertion est garantie, mais c'est un pari plutôt sûr ...


0 commentaires

9
votes

CommandéDdicongary est ce que vous voulez si vous avez besoin d'un accès à la fois à des éléments à clé et à l'insertion à des articles ... C'est vraiment une combinaison d'une table de hachage et d'une liste. Il fournit un moyen d'accéder aux éléments de celui-ci par indice d'insertion ou par clé. C'est la seule collection de .net qui fait cela. Malheureusement, ce n'est pas générique.

Si ordonnéDdicary ne répond pas à vos besoins uniquement parce qu'il n'est pas générique - alors vous pouvez utiliser La version ici qui fournit un équivalent générique . S'il y a d'autres raisons pour lesquelles cela ne fonctionne pas pour vous, mettez à jour votre message et nous pouvons rechercher une meilleure option.

Bien que vous puissiez créer votre propre liste > Vous perdrez la possibilité de rechercher efficacement la clé de manière efficace. Maintenant, vous pouvez certainement rouler votre propre mise en œuvre d'un doction commandé qui combinait la liste / dict ensemble ... mais le message que j'ai lié à déjà cela.


1 commentaires

Cela résume joliment mes options. Depuis que je n'aurai pas besoin de la recherche clé de toute façon, je vais avec IList. Merci



10
votes

Bien que je suis en retard sur le jeu, .NET Framework 4.5 fournit de nouvelles classes pour vous. Voir triédlist ou triéddiction . Si vous vous demandez lequel vous devriez utiliser lequel vous devriez utiliser, le MSDN fournit quelques bonnes raisons pour lesquelles vous pourriez en choisir un sur l'autre.

La classe générique de tri définie est une gamme de paires de touches / valeur avec une récupération O (journal n), où n est le nombre d'éléments du dictionnaire. Dans ce cas, il est similaire à la classe générique de triodicité. Les deux classes ont des modèles d'objet similaires et ont à la fois une récupération O (log n). Lorsque les deux classes diffèrent de la mémoire et de la rapidité d'insertion et de retrait:

  • sortedList utilise moins de mémoire que triéddiction . .
  • triéddiction a des opérations d'insertion et de suppression plus rapides pour les données non formées, O (log n) par opposition à O (n) pour Tritedlist .
  • Si la liste est renseignée à la fois à la fois des données triées, TritedList est plus rapide que Soyeddicary .

    Une autre différence entre le type SoyeddicDictionary et TritedList CLASSES est que LIEDLIST Prend en charge une récupération indexée efficace des clés et des valeurs via les collections renvoyées par les propriétés de clés et de valeurs. Il n'est pas nécessaire de régénérer les listes lorsque les propriétés sont accessibles, car les listes ne sont que des emballages pour les tableaux internes de clés et de valeurs.

    Les deux liens ont des remarques similaires (ce qui est l'endroit où la citation vient). Ils ont également plus d'informations pour les deux classes. Je recommanderais de lire les deux sections si vous souhaitez utiliser l'un d'entre eux.


2 commentaires

LiedList ne maintient pas l'ordre d'insertion que l'OP demande (et que je cherchais).


Liste des paires de keyValue est la meilleure façon par rapport à la commande ordonnée / ordonnancierddicary. Cela maintient l'indice selon l'insertion et le type générique de support.