2010-09-10 8 views
2

Ce que je veux est fondamentalement une collection qui est un hybride d'un dictionnaire et d'une liste. Je veux une collection à laquelle je peux ajouter des paires clé/valeur (comme un dictionnaire), mais en même temps être capable de récupérer les valeurs (sans les clés) dans le même ordre que je les ai ajoutées (comme une liste)? Une telle collection existe-t-elle dans .NET?Y at-il une collection dans .NET qui fonctionne comme un dictionnaire et une liste en même temps?

Merci

+0

duplication possible de ["LinkedHashMap" en C# 3.0] (http://stackoverflow.com/questions/486948/linkedhashmap-in-c-sharp-3-0) – nawfal

Répondre

0

Non, il n'y a rien dans le cadre qui met en œuvre cette fonctionnalité au moment (mais voir modifier ci-dessous).

Fondamentalement, vous voudriez composer un List<T> et un Dictionary<TKey, TValue> dans votre propre classe.

EDIT: J'avais vraiment oublié OrderedDictionary comme l'a souligné wesleyhill - mais je ne crois pas qu'il y ait une collection générique dans le cadre comme celui-ci. Je suppose que vous voulez une collection générique? Vous pourriez écrire un emballage autour de bien sûr ...

EDIT: Note rapide: tout en enveloppant la collection ne devrait pas être difficile du tout, vous perdrez un avantage des collections génériques: en évitant la boxe. Pas un problème si vos clés et vos valeurs sont des types de référence, bien sûr.

+0

Merci Jon .... – Truly

+2

Je demande à différer; S'il vous plaît voir ma réponse à cette question. –

+0

Jon, vous pouvez faire mieux: http://stackoverflow.com/questions/486948/linkedhashmap-in-c-3-0 (jetez un oeil à votre réponse) – atamanroman

13

Il existe une structure de données non générique appelée OrderedDictionary qui fait ce que vous voulez. Il a deux indexeurs, un qui prend un Object et fait la recherche de clé/valeur, et un qui prend un int et fait une recherche d'index. Vous pouvez également énumérer le contenu dans l'ordre dans lequel vous l'avez ajouté.

Je ne vois pas quoi que ce soit dans la documentation si la recherche de dictionnaire atteint O (1) (c'est-à-dire rapide) comportement. Étant donné qu'il implémente ISerializable, il est très probable qu'il utilise les codes de hachage des objets, et a donc O (1) recherche de dictionnaire.

Vous pouvez également créer votre propre type générique qui encapsule à la fois un List<T> et un Dictionary<TKey,TValue>.

+0

J'ai certainement une ancienne implémentation de ceci dans VB.NET et peut-être avoir une version plus récente en C# si ça vous intéresse? Le TValue est stocké dans une 'Liste ' alors qu'il y a un dictionnaire utilisé pour la clé pour indexer la recherche 'Dictionnaire '. – stevehipwell

+0

C'est en fait ce dont j'ai besoin, sauf que je cherche une collection générique. Mais je pourrais utiliser celui-là après tout. Merci beaucoup. – Truly

+1

Vous venez de surclasser la réponse de Jon Skeet. OMG –

0
  • Créer une nouvelle classe qui enveloppe le dictionnaire
  • lors de l'ajout de données, envelopper les données dans une petite classe d'aide qui introduit un indice
  • lors du retour des valeurs, les commander selon l'indice

ne serait pas un monstre de performance, mais devrait fonctionner correctement. Sinon, vous pouvez implémenter votre propre LinkedHashMap comme en Java.

Par ailleurs, un coup d'oeil à ceci: LinkedHashMap in .NET

modifier: Je aime wesleyhills idée encore plus: Liste et Dictionnaire encapsuler dans une classe. Ajoutez toujours les deux et renvoyez la liste au lieu de Dictionary.Values.

2

System.Collections.ObjectModel.KeyedCollection est très proche de ce que vous demandez, sauf que la clé de dictionnaire doit être dérivable de la valeur.

+1

+1 Cela aurait dû être attribué à la question. J'ai utilisé 'KeyedCollection ' beaucoup de fois et cela fonctionne très bien. En interne, il garde un 'List ' et un 'Dictionary ' synchronisé. – ja72