Я думаю, что статья, утверждающая, что она сохраняет порядок, просто неверна. Для простых тестов порядок вставки может быть хорошо сохранен из-за внутренней структуры, но это не гарантируется и не всегда будет работать таким образом. Я попытаюсь придумать контрпример.
РЕДАКТИРОВАТЬ: Вот контрпример:
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);
}
}
}
Печать 1, 4, 3, несмотря на то, что 3 были вставлены до 4.
возможно , что если вы никогда не удалите какие-либо элементы, это сохранит порядок вставки. Я не уверен, но я не был бы полностью удивлен. Тем не менее, я думаю, что было бы очень плохо полагаться на это:
- Это не задокументировано для такой работы, и в документации прямо указано, что она не отсортирована.
- Я не смотрел на внутренние структуры или исходный код (которого у меня, очевидно, нет) - мне пришлось бы внимательно изучить их, прежде чем делать какие-либо подобные заявления твердым образом.
- Реализация может очень легко меняться между версиями фреймворка. Полагаться на это было бы все равно, что полагать, что реализация
string.GetHashCode
не изменилась - что некоторые люди делали еще в .NET 1.1 дней, а потом они обожглись, когда реализация изменила в .NET 2.0. .