Ich denke, der Artikel, in dem behauptet wird, dass die Reihenfolge erhalten bleibt, ist schlichtweg falsch. Bei einfachen Tests kann die Einfügereihenfolge aufgrund der internen Struktur durchaus erhalten bleiben, aber das ist nicht garantiert und wird auch nicht immer so funktionieren. 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);
}
}
}
Es wird 1, 4, 3 gedruckt, obwohl 3 vor 4 eingefügt wurde.
Es ist möglich dass die Einfügereihenfolge beibehalten wird, wenn Sie keine Elemente entfernen. Ich bin mir nicht sicher, aber ich wäre nicht völlig überrascht. Ich halte es jedoch für eine sehr schlechte Idee, sich darauf zu verlassen:
- Es ist nicht dokumentiert, dass es so funktioniert, und in der Dokumentation steht ausdrücklich, dass es nicht sortiert ist.
- Ich habe mir die internen Strukturen oder den Quellcode nicht angesehen (den ich natürlich auch nicht habe) - ich müsste sie genau studieren, bevor ich eine solche Behauptung aufstellen könnte.
- Die Implementierung kann sich zwischen verschiedenen Versionen des Rahmens sehr leicht ändern. Sich darauf zu verlassen wäre so, als würde man sich auf die
string.GetHashCode
Implementierung nicht zu ändern - was einige Leute in den Tagen von .NET 1.1 taten, und dann wurden sie verbrannt, als die Implementierung hat Änderung in .NET 2.0...
1 Stimmen
Auf meinem Computer
new HashSet<int>() { 6, 8 }.ToList()
liefert [6,8], abernew HashSet<int>() { 8, 6 }.ToList()
Rückgabe [8,6]0 Stimmen
Dies könnte durch folgende Lektüre erklärt werden github.com/dotnet/corefx/blob/master/src/System.Collections/src/
0 Stimmen
Falls Sie eine solche Sammlung benötigen, schauen Sie sich diese an: github.com/OndrejPetrzilka/Rock.Collections