Je pense que l'article affirmant qu'il préserve la commande est tout simplement faux. Pour de simples tests de l'ordre d'insertion peuvent ainsi être conservés en raison de la structure interne, mais il n'est pas garanti et ne fonctionne pas toujours de cette façon. Je vais essayer de trouver un contre-exemple.
EDIT: Voici le contre-exemple:
using System;
using System.Collections.Generic;
class Test
{
static void Main()
{
var set = new HashSet<int>();
set.Add(1);
set.Add(2);
set.Add(3);
set.Remove(2);
set.Add(4);
foreach (int x in set)
{
Console.WriteLine(x);
}
}
}
Ceci permet d'imprimer 1, 4, 3, malgré 3 ayant été insérée avant 4.
Il est possible que, si vous ne retirez jamais tous les éléments, il permettra de préserver l'ordre d'insertion. Je ne suis pas sûr, mais je ne serais pas totalement surpris. Cependant, je pense que ce serait une très mauvaise idée de s'appuyer sur:
- Ce n'est pas documentée à travailler de cette façon, et la documentation stipule explicitement que ce n'est pas triée.
- Je n'ai pas regardé à l'intérieur de structures ou de code source (je n'en ai pas, évidemment) - j'aurais à les étudier attentivement avant de prendre une telle demande dans une ferme.
- La mise en œuvre pourraient modifier très facilement entre les différentes versions du framework. En s'appuyant sur ce serait comme s'appuyant sur l'
string.GetHashCode
mise en œuvre pas de modification de certaines personnes dans les .NET 1.1 jours, et ensuite ils ont été brûlés lors de la mise en œuvre n'a changer dans .NET 2.0...