C# dictionnaire vs utilisation des listes de
J'avais deux questions. Je me demandais si il est facile de classe en C# bibliothèque qui stocke des paires de valeurs au lieu d'un seul, de sorte que je peux stocker une classe et d'un entier dans le même nœud de la liste. Je pense que le plus simple est de faire juste un conteneur de classe, mais comme c'est du travail supplémentaire à chaque fois. Je voulais savoir si je dois le faire ou pas. Je sais que dans les versions ultérieures de .NET ( je suis en utilisant 3.5) qu'il y a des tuples que je peux stocker, mais qui n'est pas disponible pour moi.
Je suppose que la plus grande question est de savoir quelles sont la mémoire inconvénients de l'utilisation d'un dictionnaire pour stocker la classe integer carte, même si je n'ai pas besoin d'un accès en O(1) et peut se permettre de simplement rechercher dans la liste? Quelle est la taille minimale de la table de hachage? dois-je simplement faire la classe wrapper-je besoin?
- Pas une classe mais une structure (struct): KeyValuePair. Il y a aussi Tuple (qui est une classe).
Vous devez vous connecter pour publier un commentaire.
Si vous avez besoin de stocker une liste non ordonnée de
{integer, value}
, alors je suggère de faire la classe wrapper. Si vous avez besoin d'une structure de données dans laquelle vous pouvez rechercher desinteger
pour obtenirvalue
(ou, de recherchervalue
pour obtenirinteger
), alors je vous suggère un dictionnaire.La décision de
List<Tuple<T1, T2>>
(ouList<KeyValuePair<T1, T2>>
) vsDictionary<T1, T2>
est en grande partie à la baisse de ce que vous voulez faire avec elle.Si vous allez être à stocker de l'information et puis en itérant sur elle, sans avoir besoin de faire de fréquentes recherches sur la base de la valeur de clé, puis un
List
est probablement ce que vous voulez. Selon comment vous allez l'utiliser, unLinkedList
peut-être encore mieux - un peu plus de mémoire de frais généraux, plus rapide la manipulation du contenu (ajouter/supprimer) des opérations.D'autre part, si vous allez être en utilisant principalement la première valeur comme une clé de fréquentes recherches, puis un
Dictionary
est conçu spécifiquement pour cet usage. Valeur de la clé de la recherche et la comparaison est nettement améliorée, de sorte que si vous faites beaucoup avec les touches et votre liste est grande un Dictionnaire vous donnera un gros boost de vitesse.De la taille des données est importante pour la décision. Si vous parlez d'un couple de cent points ou moins, un
List
est probablement pas un problème. Au-dessus de ce point, le temps de recherche sera probablement un impact plus significatif sur le temps d'exécution, doncDictionary
peut-être plus la peine.Il n'existe pas de règles strictes et rapides. Chaque cas est différent, donc vous devez équilibrer vos exigences contre les frais généraux.
Vous pouvez utiliser une liste de KeyValuePair:http://msdn.microsoft.com/en-us/library/5tbh8a42.aspx
KeyValuePair<TKey, TValue>
est un struct, ce qui signifie que vous avez à traiter avec la parfois gênants structure sémantique.Vous pouvez utiliser un
Tuple<T,T1>
, une liste deKeyValuePair<T, T1>
- ou, un type anonyme, par exempleVous pouvez utiliser KeyValuePair ou Tuple
Pour Tuple, vous pouvez lire la suite utile post:
Ce critère était le tuple conçu pour les résoudre?