Ich denke, der Artikel, der behauptet, er bewahre die Bestellung, ist einfach falsch. Bei einfachen Tests kann die Einfügereihenfolge aufgrund der internen Struktur zwar beibehalten werden, sie ist jedoch nicht garantiert und funktioniert nicht immer so. Ich werde versuchen, ein Gegenbeispiel zu finden.
EDIT: Hier ist das Gegenbeispiel:
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);
}
}
}
Dies druckt 1, 4, 3, obwohl 3 vor 4 eingefügt wurde.
Es ist möglich, dass die Einfügereihenfolge beibehalten wird, wenn Sie niemals Elemente entfernen. Ich bin mir nicht sicher, aber ich wäre nicht ganz überrascht. Ich denke jedoch, dass es eine sehr schlechte Idee wäre, sich darauf zu verlassen:
- Es ist nicht dokumentiert, dass dies so funktioniert, und in der Dokumentation wird ausdrücklich angegeben, dass es nicht sortiert ist.
- Ich habe mir die internen Strukturen oder den Quellcode nicht angesehen (was ich natürlich nicht habe) - ich müsste sie sorgfältig studieren, bevor ich einen solchen Anspruch auf feste Weise geltend machen kann.
- Die Implementierung kann sehr leicht zwischen den Versionen des Frameworks wechseln. Unter Berufung auf diese wäre wie unter Berufung auf der
string.GetHashCode
Umsetzung nicht zu ändern - die einige Leute in den .NET 1,1 Tagen taten zurück, und dann wurde sie verbrannt , wenn die Umsetzung tut Änderung in .NET 2.0 ...
new HashSet<int>() { 6, 8 }.ToList()
kehrt [6,8] zurück, abernew HashSet<int>() { 8, 6 }.ToList()
[8,6]