web-dev-qa-db-fra.com

L'ordre des éléments dans le dictionnaire

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?

94
Captain Comic

L'ordre des éléments dans un dictionnaire est non déterministe. La notion d'ordre n'est tout simplement pas définie pour les hashtables. Ne vous contentez donc pas d'énumérer dans le même ordre que les éléments ajoutés au dictionnaire. Ce n'est pas garanti.

Citation de la doc :

Aux fins de l'énumération, chaque élément du dictionnaire est traité comme un KeyValuePair<TKey, TValue> structure représentant une valeur et sa clé. L'ordre dans lequel les articles sont retournés est indéfini.

112
Darin Dimitrov

Vous pouvez toujours utiliser SortedDictionary pour cela. Notez que le dictionnaire est classé 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, car la documentation indique que:

Les éléments d'un OrderedDictionary ne sont pas triés par la clé, contrairement aux éléments d'une classe SortedDictionary.

24
Adrian Carneiro

Si vous voulez que les éléments soient commandés, utilisez un OrderedDictionary . Un dictionnaire/dictionnaire hastable ordinaire n'est commandé que dans un certain sens de la structure de stockage.

23
Mitch Wheat

Les éléments seront retournés dans l'ordre dans lequel ils seront stockés physiquement dans le dictionnaire, ce 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 devez jamais compter sur le maintien de l'ordre.

Vous pouvez commander les articles en les énumérant:

foreach (KeyValuePair<string, string> kvp in _Dictionary.OrderBy(k => k.Value)) {
  ...
}

Dans le framework 2.0, vous devez d'abord mettre les éléments dans une liste pour les trier:

List<KeyValuePair<string, string>> items = new List<KeyValuePair<string, string>>(_Dictionary);
items.Sort(delegate(KeyValuePair<string, string> x, KeyValuePair<string, string> y) { return x.Value.CompareTo(y.Value); });
foreach (KeyValuePair<string,string> kvp in items) {
  ...
}
12
Guffa

Pour un dictionnaire commandé:

 var _OrderedDictionary = new System.Collections.Specialized.OrderedDictionary();

_OrderedDictionary.Add("testKey1", "testValue1");
_OrderedDictionary.Add("testKey2", "testValue2");
_OrderedDictionary.Add("testKey3", "testValue3");

var k = _OrderedDictionary.Keys.GetEnumerator();
var v = _OrderedDictionary.Values.GetEnumerator();

while (k.MoveNext() && v.MoveNext()) {
    var key = k.Current; var value = v.Current;
}

Les articles sont retournés dans l'ordre dans lequel ils ont été ajoutés.

11
Barton

Les tableaux associatifs (ou tables de hachage) ne sont pas ordonnés, ce qui signifie que les éléments peuvent être ordonnés de toutes les manières imaginables.

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 y travailler.

Je ne peux pas vous donner un échantillon C # car je ne connais pas la langue, mais cela devrait suffire pour que vous continuiez.

4
Tim Čas