Сохраняющие порядок структуры данных в C#

Это:

socks, pairs = Counter(map(int,input().strip().split())), 0

означает:

(socks, pairs) = (Counter(map(int,input().strip().split())), 0)

Это как если бы вы написали:

socks = Counter(map(int,input().strip().split()))
pairs = 0

Разница в том, что правая сторона полностью оценена до назначения, но это не имеет значения здесь

Но размеры кортежей должны совпадать. Когда вы опускаете ,0, оно становится:

(socks, pairs) = (Counter(map(int,input().strip().split())), )

Как видите, размеры не совпадают. Это то, что вызывает проблему.

28
задан Palec 2 May 2019 в 09:25
поделиться

3 ответа

Вы НЕ должны ожидать, что ключи или значения в обычном Dictionary , которые должны поддерживаться в любом порядке.В SortedDictionary ключи и значения поддерживаются в порядке значения ключа - это не то же самое, что и порядок вставки .

Единственный встроенный словарь в платформе .NET, который сохраняет порядок вставки, - это System.Collections.Specialized.OrderedDictionary . К сожалению, этот класс не является универсальным, однако написать для него универсальную оболочку не так уж и сложно. Имейте в виду, что при работе с типами значений (например, int или double ) это приведет к блокированию ключей / значений (общие словари не накладывают блокировку на типы значений).

39
ответ дан 28 November 2019 в 03:43
поделиться

Как отметил @Anton, Dictionary<TKey,TValue> - неупорядоченная коллекция. Правильный возврат ваших значений является совпадением и в конечном итоге потерпит неудачу. Если вам нужна заказанная хеш-таблица, вы должны использовать SortedDictionary<TKey,TValue>

-1
ответ дан JaredPar 28 November 2019 в 03:43
поделиться

В любом случае, полагайтесь на Dictionary<TKey, TValue>, чтобы сохранить порядок!

Хотя Dictionary<TKey, TValue> ясно заявляет, что порядок перечисления не определен, мы проверили, что он действительно сохраняет порядок вставки (по крайней мере, до тех пор, пока вы не удаляйте предметы из него). Если кто-то может предоставить тест, который опровергает его, мы были бы очень заинтересованы, поскольку наш производственный код опирается на него.

Вы можете использовать тот же подход и сэкономить немного усилий, а своему клиенту - немного денег.

Конечно, Microsoft может изменить реализацию словаря в будущей версии .NET, но если это произойдет, ваш автоматический тест обнаружит его, и вы сможете заменить словарь другим контейнером в это время, верно?

-6
ответ дан Kurt Nørre 28 November 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: