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?
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