web-dev-qa-db-fra.com

OrdonnéDictionnaire et dictionnaire

Je cherchais un moyen pour que mon Dictionary énumère ses KeyValuePair dans le même ordre où ils ont été ajoutés. Maintenant, documentation du dictionnaire indique clairement que:

Aux fins d'é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 n'est pas défini.

J'ai découvert que ce dont j'avais besoin était un OrderedDictionary, mais étant le sceptique que je suis, j'ai décidé de l'essayer moi-même:

OrderedDictionary od = new OrderedDictionary();
Dictionary<String, String> d = new Dictionary<String, String>();

for (int i = 0; i < 10; i++)
{
    od.Add("key" + i, "value" + i);
    d.Add("key" + i, "value" + i);
}

System.Console.WriteLine("OrderedDictionary");
foreach (DictionaryEntry de in od) {
    System.Console.WriteLine(de.Key + ", " + de.Value);
}

System.Console.WriteLine("Dictionary");
foreach (var tmp in d) {
    System.Console.WriteLine(tmp.Key + ", " + tmp.Value);
}

Sortie:

OrderedDictionary
key0, value0
key1, value1
key2, value2
...

Dictionary
key0, value0
key1, value1
key2, value2
...

Comme vous pouvez le voir, les deux sont ordonnés, ce qui soulève deux questions:

Dans quel cas le Dictionary donne-t-il un ordre différent de celui dans lequel les valeurs sont ajoutées? Ma première boucle foreach m'assure-t-elle de récupérer mon KeyValuePair dans le même ordre, ou dois-je utiliser l'index?

51
DeadlyJesus

Tu le fais incorectement. Vous devez non seulement insérer des valeurs séquentiellement dans le dictionnaire, mais également supprimer certains éléments et voir comment l'ordre a changé après cela. Le code suivant le démontre:

OrderedDictionary od = new OrderedDictionary();
Dictionary<String, String> d = new Dictionary<String, String>();
Random r = new Random();

for (int i = 0; i < 10; i++)
{
    od.Add("key" + i, "value" + i);
    d.Add("key" + i, "value" + i);
    if (i % 3 == 0)
    {
        od.Remove("key" + r.Next(d.Count));
        d.Remove("key" + r.Next(d.Count));
    }
}

System.Console.WriteLine("OrderedDictionary");
foreach (DictionaryEntry de in od) {
    System.Console.WriteLine(de.Key + ", " +de.Value);
}

System.Console.WriteLine("Dictionary");
foreach (var tmp in d) {
    System.Console.WriteLine(tmp.Key + ", " + tmp.Value);
}

imprime quelque chose de similaire à (OrderedDictionary est toujours commandé):

OrderedDictionary
key3, value3
key5, value5
key6, value6
key7, value7
key8, value8
key9, value9
Dictionary
key7, value7
key4, value4
key3, value3
key5, value5
key6, value6
key8, value8
key9, value9
61
Ilya Ivanov