|
Порядок ключей в Dictionary<TKey, TValue>
|
|||
---|---|---|---|
#18+
Казалось бы тема старая, давно разобранная, и ответ здесь только один - в общем случае порядок ключей недетерминирован. Однако на днях выяснилось, что некоторые разработчики считают иначе. Предыстория. На днях понадобилось порыться в исходниках EPPlus для уяснения некоторых нюансов формирования разметки в потрохах xslx. В процессе наткнулся на следующее. В составе пакета xslx есть т.н. shared strings table - просто словарик со строками, на которые даются ссылки. Сделано это для предотвращения распухания размера xlsx. Сам словарик живет в файле sharedStrings.xml в составе пакета, имеет вид Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Ссылки на строки делаются в файлах содержимого worksheets (sheet1.xml .. sheetN.xml), имеющих вид (в части описания ячеек) Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Ссылка на строку из словаря - значение тэга v, zero-based индекс узла si в файле sharedStrings.xml. Т.е. порядок следования строк в sharedStrings.xml имеет значение. Далее. В EPPLus словарь со строками заполняется при сохранении пакета в тот момент, когда формируются файлы листов (sheet1.xml .. sheetN.xml). Делается это вот здесь . Строки сохраняется в обычный Dictionary<>, у которого ключ - сама строка, а значение - internal-класс со служебной информацией (в т.ч. порядковым номером строки в словаре). После того, как все файлы листов сформированы, словарик считается заполненным, и сериализуется в xml вот здесь . И сериализуется он простым проходом по итератору коллекции ключей словаря, без каких-либо упорядочиваний и сортировок. Т.е. автор библиотеки уверен, что ключи в итераторе следуют в той последовательности, в которой они были добавлены (а эта последовательность важна - см. выше). Поскольку EPPlus - достаточно серьёзная разработка, за которую сейчас люди платят деньги, то, я думаю, если бы препдположение о следовании ключей в порядке добавления было бы неверным, это где-нибудь уже вылезло, и было пофиксено. Сижу вот, роюсь в документации-форумах, и нигде пока ничего не нахожу в подтверждение, кроме всё того же постулата о недетерминированности порядка. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2021, 14:30 |
|
Порядок ключей в Dictionary<TKey, TValue>
|
|||
---|---|---|---|
#18+
Ну по факту хэш int-ключа будет сам int, поэтому сортировка случайно совпадает, видимо, поэтому глюк нигде не всплыл. Но это глюк, да, никто не обещал детерминированность. Я и сам иной раз забывал по ключу отсортировать, но вовремя спохватывался. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2021, 14:36 |
|
Порядок ключей в Dictionary<TKey, TValue>
|
|||
---|---|---|---|
#18+
из этого словаря могут строки удаляться? если нет, то строка попав хоть раз в эту коллекцию получает индекс и её порядок не меняется вообще не сталкивался с такой проблемой, если честно, хоть и с табличкой строк приходилось работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2021, 15:41 |
|
Порядок ключей в Dictionary<TKey, TValue>
|
|||
---|---|---|---|
#18+
Shocker.Pro, Тем более что там ключ string, а не int. И, тем не менее: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2021, 15:49 |
|
Порядок ключей в Dictionary<TKey, TValue>
|
|||
---|---|---|---|
#18+
Roman Mejtes из этого словаря могут строки удаляться? если нет, то строка попав хоть раз в эту коллекцию получает индекс и её порядок не меняется Понятно, что порядок не меняется, вопрос - какой порядок не меняется. Что это за порядок. Как бы все считают, что непонятно какой ввиду использования хэшфункции. На практике получается, что это порядок добавления ключей. Только это нигде не документировано. Roman Mejtes вообще не сталкивался с такой проблемой, если честно, хоть и с табличкой строк приходилось работать. Это не проблема, это просто вопрос, почему так. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2021, 15:53 |
|
Порядок ключей в Dictionary<TKey, TValue>
|
|||
---|---|---|---|
#18+
Сон Веры Павловны Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2021, 16:04 |
|
Порядок ключей в Dictionary<TKey, TValue>
|
|||
---|---|---|---|
#18+
Сон Веры Павловны Только это нигде не документировано. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2021, 16:05 |
|
Порядок ключей в Dictionary<TKey, TValue>
|
|||
---|---|---|---|
#18+
Shocker.Pro Насколько я помню, в каком-то из словарей до определенного количества ключей не используется хэш... Не тот случай - здесь ключей может быть очень много. Сейчас вот под рукой не особенно большой документ, sharedStrings.xml из него в распакованном виде весит 13 Мб. А если в документе несколько листов (sharedStrings.xml всегда один на весь документ), много колонок, значения строк редко повторяются, то легко может быть и в 5 раз больше. Shocker.Pro если это будет документировано, но это не позволит менять реализацию, так что всё правильно Ну, т.е. автор не особенно правильно делает, используя вот такое недокументированное поведение словаря. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2021, 17:06 |
|
|
start [/forum/topic.php?fid=20&msg=40038072&tid=1398381]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 268ms |
total: | 403ms |
0 / 0 |