2016-04-10 2 views
1

This Ответ на StackOverflow полностью описывает, что HashSet неупорядочен и его порядок перечисления элементов не определен и на него не следует полагаться.Сохраняет ли HashSet порядок между перечислениями?

Однако

Это приводит anouther вопрос: я должен или я не должен полагаться на порядка enumeraetion между двумя sebsequent перечислений? При отсутствии вставки или удаления.

Например, позволяет сказать, что я добавил некоторые детали к HashSet:

HashSet<int> set = new HashSet<int>(); 
set.Add(1); 
set.Add(2); 
set.Add(3); 
set.Add(4); 
set.Add(5); 

Теперь, когда я перечисляю этот набор через foreach, скажу я получаю эту последовательность:

// Result: 1, 3, 4, 5, 2. 

Вопрос в следующем: сохранит ли порядок, если я снова перечислил множество, если у меня нет вставок/абзацев? Всегда будет то же самое?

+5

Даже если это было правдой, это должно было быть документировано. Поскольку это не так, я бы не стал полагаться на это. Он может сломаться в вашем лице в любое время с будущим обновлением структуры. Почему на Земле вы использовали бы хэш, если вам нужен гарантированный порядок перечисления. Это абсолютно неправильная структура данных, которую вы выбрали для моделирования своих данных с учетом ваших требований. –

+1

Поскольку хэш-набор в основном представляет собой хеш-таблицу, которая имеет фиксированный порядок слотов, да, порядок итерации является постоянным, если вы вообще не изменяете набор. Если вы полагаетесь на это, хотя? Нет, я так не думаю, вам следует избегать полагаться на это. – poke

+0

Ну, я пытаюсь полагаться только на порядок двух последовательных перечислений набора, вот и все. Мне нужна структура данных O (1) add/remove плюс положительный ответ на вопрос выше. Есть ли? – AgentFire

ответ

2

Практически говоря, это всегда может быть одинаковым между перечислениями, но это предположение не предусмотрено в описании IEnumerable, и разработчик может решить вернуться тогда в зависимости от того, что он хочет.

Кто знает, что он делает под капотом, и будет ли он продолжать делать то же самое в будущем. Например, будущая реализация HashSet может быть оптимизирована для обнаружения условий низкой памяти и переупорядочения ее содержимого в памяти, тем самым влияя на порядок, в котором они возвращаются. Таким образом, в 99,9% случаев они вернутся к одному и тому же порядку, но если вы начнете исчерпывать ресурсы памяти, это внезапно вернет вещи в другом порядке.

Подводя итог, я бы не стал полагаться на порядок перечисления со временем. Если заказ важен для вас, тогда сделайте свой foreach за set.OrderBy(x => x), чтобы вы могли убедиться, что он в том порядке, в котором вы хотите.

Смежные вопросы