2010-02-08 9 views
1

Dans Silverlight3, lorsqu'un dictionnaire générique est itéré avec foreach et KeyValuePair, l'itération garantit la consultation des éléments du dictionnaire dans l'ordre dans lequel les éléments ont été ajoutés ? Autrement dit, la séquence d'itération n'a rien à voir avec le type de données de la clé ou sa valeur? La documentation est moins explicite sur ce point:Silverlight 3: ordre d'itération du dictionnaire générique utilisant foreach KeyValuePair

Ce code produira une sortie similaire aux suivantes: http://msdn.microsoft.com/en-us/library/bwabdf9z.aspx (italique ajouté)

Dictionary<String, Object> 
foreach (KeyValuePair String, Object kvp in myDictionary) {} 

Dictionary<UInt16, String> 
foreach (KeyValuePair UInt16, String kvp in myDictionary) {} 

Merci

Répondre

1

L'ordre d'itération dépend du codes de hachage de la clé et n'a rien à faire l'ordre dans lequel ils ont été ajoutés

1

Je ne serais pas dépendant du code sur un ordre de tri spécifique. Si vous avez besoin d'un collection/dictionnaire qui itère avec un ordre spécifique, vous devez le commander en premier (en utilisant la méthode Linq OrderBy). Même si votre code est correct aujourd'hui, vous pouvez profiter de l'exécution parallèle des tâches à venir, puis revoir les détails d'implémentation de votre code.

+0

Merci pour les réponses utiles. – Tim

2

La spécification du dictionnaire indique que l'ordre d'itération est indéfini. Donc vous ne devriez pas en dépendre. En réalité, si vous décompilez l'implémentation réelle en utilisant quelque chose comme Reflector, vous verrez qu'elle utilise un tableau de sauvegarde pour les propriétés Values ​​/ Keys (avec des sentinelles pour les éléments supprimés). La façon dont cela est implémenté entraîne l'itération dans l'ordre dans lequel vous avez ajouté des choses. Vous n'êtes simplement pas autorisé à compter sur cela. J'imagine qu'il y a un certain nombre de personnes qui, involontairement, dépendent d'un tel comportement, alors je doute qu'ils changeraient cela bientôt. Je ne voudrais toujours pas m'en servir pour autre chose qu'un morceau de code jetable.

Questions connexes