10
votes

C #: Est-ce qu'un triodictionnaire trié quand vous vous énumérer dessus?

Un triéictionnaire est conforme à MSDN trié sur la clé. Cela signifie-t-il que vous pouvez être sûr que cela sera trié quand vous l'énumérer dans un forach? Ou cela signifie-t-il simplement que le triodictionnaire fonctionne de cette façon d'avoir une meilleure performance dans divers cas?


0 commentaires

4 Réponses :


0
votes

Oui, c'est exactement ce que cela signifie.

EDIT: la partie qui dit "Cela signifie-t-il que vous pouvez être sûr que cela sera trié quand vous l'énumérer dans un forach?"


1 commentaires

Est-il garanti que c'est trié? (par rapport au dictionnaire régulier où il n'est pas)



6
votes

Lorsque vous énumérez la collection, il est trié par les touches (même si vous énumérez-vous dire les valeurs collection). En interne, la collection est implémentée comme arbre de recherche binaire (selon la documentation). L'insertion et la recherche de valeurs sont O (log n) (ce qui signifie qu'ils sont assez efficaces).


0 commentaires

11
votes

de MSDN :

Le dictionnaire est maintenu dans un ordre trié à l'aide d'un arbre interne. Chaque nouvel élément est positionné à la position de tri correcte et l'arbre est ajusté pour maintenir l'ordre de tri chaque fois qu'un élément est enlevé. Tandis que énumérer, l'ordre de tri est maintenu.


1 commentaires

MDR. Où dit-il ça? J'ai lu comme ... tout ça ... Doit devenir aveugle ...



0
votes

Si vous énumérez les éléments dans un triodictionnaire code>, les éléments seront renvoyés dans l'ordre de tri des clés d'élément. Et si vous énumérez par les touches du type code> code>, les touches seront également renvoyées dans la commande triée. Et peut-être un peu surprenant, si vous énumérez le type code> par ses valeurs, les valeurs sont renvoyées dans l'ordre de tri des touches, pas em> l'ordre de tri des valeurs comme vous leuriez peut-être attendez-vous.

démonstration: strong> p>

Notez que dans cette démo, les éléments ajoutés auddictionner code> sont em> pas em> ajoutés ordre trié. p>

En outre, si vous envisagez d'énumérer votre dictionnaire par ses valeurs et que vous avez une possibilité de valeurs en double forts>, envisagez d'avoir votre fonction de recherche inversée Renvoie un iNeumable . (Bien sûr, pour les grands dictionnaires, la recherche d'une clé par sa valeur peut entraîner une mauvaise performance.) P> xxx pré>

Sortie attendue: strong> p >

== Enumerating Items ==
1 => One
2 => Two
3 => Three
4 => Four
5 => Five

== Enumerating Keys ==
1 => One
2 => Two
3 => Three
4 => Four
5 => Five

== Enumerating Values ==
One => 1
Two => 2
Three => 3
Four => 4
Five => 5


0 commentaires