Il y a beaucoup de bonnes idées ici, mais dispersés, donc je vais essayer de créer une réponse qui pose mieux, même si le problème a été répondu.
Tout d'abord, un Dictionnaire n'a pas la garantie de l'ordre, de sorte que vous ne les utiliser que pour chercher rapidement une clé et trouver une valeur correspondante, ou de vous énumérer toutes les paires clé-valeur, sans se soucier de ce que l'ordre est.
Si vous souhaitez commander, vous pouvez utiliser un OrderedDictionary mais la différence est que la recherche est plus lent, donc, si vous n'avez pas besoin d'ordre, ne le demandez pas.
Les dictionnaires (et HashMap en Java) utiliser le hachage. Qui est O(1) quelle que soit la taille de votre table. Commandé dictionnaires utilisent généralement une forme d'équilibre de l'arbre qui est en O(log2(n)), de sorte que vos données augmente, l'accès devient plus lent. Pour comparer, pour 1 millions d'éléments, c'est de l'ordre de 2^20, de sorte que vous avez à faire sur l'ordre de 20 recherches pour un arbre, mais 1 pour une valeur de hachage de la carte. C'est BEAUCOUP plus rapide.
Le hachage est déterministe. Le Non-déterminisme signifie que lorsque vous hachage(5) la première fois, et vous hachage(5) la prochaine fois, vous obtenez un endroit différent. Que ce serait complètement inutile.
Ce que les gens veulent dire, c'est que si vous ajoutez quelque chose à un dictionnaire, l'ordre est compliqué, et sous réserve de modifier à tout moment vous ajouter (ou supprimer) un élément. Imaginez, par exemple, la table de hachage a 500k éléments, et vous avez 400k de valeurs. Lorsque vous ajoutez un de plus, vous atteignez le seuil critique parce qu'il a besoin d'environ 20% d'espace vide pour être efficace, il alloue une plus grande table (par exemple, 1 million d'entrées) et re-hachage toutes les valeurs. Maintenant ils sont tous dans des endroits différents qu'ils ne l'étaient avant.
Si vous construisez le même Dictionnaire à deux reprises (lire ma déclaration en détail, LE MÊME), vous obtiendrez le même ordre. Mais comme Jon correctement dit, ne comptez pas sur elle. Trop de choses peuvent faire pas les mêmes, même le initialement alloués taille.
Cela soulève un excellent point. C'est vraiment, vraiment cher pour redimensionner une hashmap. Cela signifie que vous devez allouer un plus grand tableau, et insérez-la de nouveau chaque paire clé-valeur. Alors, il vaut la peine de l'allocation de 10x la mémoire dont il a besoin, plutôt que d'avoir même un seul grandir arriver. Connaître votre taille de la table de hachage, et préallouer assez, si c'est possible, c'est une énorme performance de gagner. Et si vous avez une mauvaise mise en œuvre, qui n'est pas redimensionnée, il peut être une catastrophe si vous prenez trop petite de taille.
Maintenant, ce que Jon a fait valoir avec moi dans mon commentaire dans sa réponse a été que, si vous ajoutez des objets à un Dictionnaire en deux pistes, vous obtiendrez deux différents rangements. Vrai, mais ce n'est pas le dictionnaire de la faute.
Quand vous dites:
new Foo();
vous êtes à la création d'un nouvel objet à un nouvel emplacement dans la mémoire.
Si vous utilisez la valeur Foo que la clé dans un dictionnaire, sans aucune autre information, la seule chose qu'ils peuvent faire est d'utiliser l'adresse de l'objet en tant que clé.
Cela signifie que
var f1 = new Foo(1);
var f2 = new Foo(1);
f1 et f2 ne sont pas le même objet, même si elles ont les mêmes valeurs.
Donc, si vous étiez à les mettre dans les Dictionnaires:
var test = new Dictionary<Foo, string>();
test.Add(f1, "zero");
ne vous attendez pas à être le même que:
var test = new Dictionary<Foo, string>();
test.Add(f2, "zero");
même si f1 et f2 ont les mêmes valeurs. Qui n'a rien à voir avec le comportement déterministe du Dictionnaire.
Le hachage est un super sujet en informatique, mes favoris pour enseigner dans des structures de données.
Découvrez Cormen et Leiserson pour un livre sur les arbres rouge-noir vs hachage
Ce gars nommé Bob a un excellent site sur le hachage, et d'optimiser les hachages: http://burtleburtle.net/bob