Ma question concerne l'énumération des éléments du dictionnaire
// Dictionary definition
private Dictionary<string, string> _Dictionary = new Dictionary<string, string>();
// add values using add
_Dictionary.Add("orange", "1");
_Dictionary.Add("apple", "4");
_Dictionary.Add("cucumber", "6");
// add values using []
_Dictionary["banana"] = 7;
_Dictionary["pineapple"] = 7;
// Now lets see how elements are returned by IEnumerator
foreach (KeyValuePair<string, string> kvp in _Dictionary)
{
Trace.Write(String.Format("{0}={1}", kvp.Key, kvp.Value));
}
Dans quel ordre les éléments seront-ils énumérés? Puis-je forcer l'ordre à être alphabétique?
c#
.net
dictionary
ienumerable
Capitaine Comic
la source
la source
Réponses:
L'ordre des éléments dans un dictionnaire n'est pas déterministe. La notion d'ordre n'est tout simplement pas définie pour les tables de hachage. Ne vous fiez donc pas à l'énumération dans le même ordre que les éléments ont été ajoutés au dictionnaire. Ce n'est pas garanti.
Citation du doc :
la source
Si vous voulez que les éléments soient classés, utilisez un OrderedDictionary . Un dictionnaire / dictionnaire hastable ordinaire n'est ordonné que dans un certain sens de la disposition de stockage.
la source
Vous pouvez toujours utiliser
SortedDictionary
pour cela. Notez que le dictionnaire est trié par clé, par défaut, sauf si un comparateur a été spécifié.Je suis sceptique quant à l'utilisation de
OrderedDictionary
pour ce que vous voulez puisque la documentation dit que:la source
SortedDictionary<K,V>
est implémenté en tant qu'arbre de recherche binaire, ce qui donne à ses opérations une complexité temporelle et spatiale différente de celle basée sur la table de hachageDictionary<K,V>
. Si les utilisateurs ont besoin d'uneO(1)
structure de table de hachage d'insertion / suppression et souhaitent également parcourir les éléments dans l'ordre des clés, ils devraient à ladict.Keys.OrderBy( k => k ).Select( k => dict[k] )
place (au prix de l'O(n)
espace et duO( n log n )
temps) pour leOrderBy()
(qui devra mettre en mémoire tampon toute la collection de clés dans une liste interne ).Les éléments seront retournés dans l'ordre dans lequel ils ont été stockés physiquement dans le dictionnaire, qui dépend du code de hachage et de l'ordre dans lequel les éléments ont été ajoutés. Ainsi, l'ordre semblera aléatoire, et à mesure que les implémentations changent, vous ne devriez jamais dépendre du fait que l'ordre reste le même.
Vous pouvez commander les éléments lors de leur énumération:
Dans le framework 2.0, vous devez d'abord mettre les éléments dans une liste afin de les trier:
la source
Pour un OrderedDictionary:
Les articles sont retournés dans l'ordre dans lequel ils ont été ajoutés.
la source
Les tableaux associatifs (aka, tables de hachage) ne sont pas ordonnés, ce qui signifie que les éléments peuvent être ordonnés de n'importe quelle manière imaginable.
CEPENDANT, vous pouvez récupérer les clés du tableau (uniquement les clés), les classer par ordre alphabétique (via une fonction de tri), puis travailler dessus.
Je ne peux pas vous donner d'exemple C # car je ne connais pas le langage, mais cela devrait suffire pour que vous puissiez continuer vous-même.
la source