Сохраняет ли HashSet порядок вставки *, если ни один элемент не удален * - PullRequest
0 голосов
/ 18 января 2019

Я знаю, что было несколько вопросов относительно HashSet и сохранения заказа, и очень простые тесты показывают, что при добавлении и удалении элементов заказ не будет сохранен вообще.

Но мой вопрос явно связан с тем, сохраняется ли порядок вставки, если из HashSet.

не удаляются никакие элементы.

Еще в 2009 году Джон Скит (https://stackoverflow.com/a/657289/10894153) сказал, что:

Возможно, что если вы никогда не удалите какие-либо элементы, это сохранит порядок вставки. Я не уверен, но я не был бы полностью удивлен.

В то время он утверждал, что:

Я не смотрел на внутренние структуры или исходный код (которого у меня, очевидно, нет).

Очевидно, что это изменилось, и теперь .NET с открытым исходным кодом, мне интересно, может ли кто-нибудь с уверенностью проверить, действительно ли порядок вставок сохраняется на HashSet, когда ни один элемент не удален.

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

EDIT

Как указывает HimBromBeere, официальная документация для HashSet гласит, что порядок не сохраняется и, следовательно, даже если текущие реализации поддерживают (хотя ясно, что они не гарантируют это), порядок вставки это может измениться в будущем.

При этом меня интересует, поддерживается ли порядок вставки, когда не происходит удаления в текущей реализации (.NET 4.7.2)

1 Ответ

0 голосов
/ 18 января 2019

При этом меня интересует, является ли порядок вставки поддерживается, когда в текущей реализации не происходит удаление.

Да, поддерживается в 4.7.2. По состоянию на 18 января 2019 года.

Я подозреваю, что частью проблемы здесь является понимание разницы между контрактом и реализацией.

Реализация из HashSet в 4.7.2 будет поддерживать порядок вставки (если вы не удаляете элементы). Но вы изначально не спрашивали об этом. Вы спросили:

порядок размещения гарантирован

И на этот вопрос однозначный ответ. Нет. гарантии метода определяются не реализацией, а контрактом. И контракт гласит:

Набор - это коллекция, которая не содержит повторяющихся элементов, и чьи элементы в произвольном порядке.

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

Теперь - вы можете игнорировать гарантии и развертывать приложение, основываясь на текущем поведении. И до тех пор, пока Microsoft не выпустит исправление Windows Update, которое изменяет поведение (или ваш код работает в другой реализации, такой как Mono и т. Д.), Вы, вероятно, будете в порядке. Но , вероятно, - это не то же самое, что , определенно (или гарантировано ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...