Подтвердить что ты не робот

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

MSDN не имеет информации о свойствах структур данных, сохраняющих порядок. Итак, я сделал предположение, что:

  • HashTable и HashSet не сохраняют порядок вставки (т.е. "Хэш" в этом случае - дешевая распродажа)
  • Словарь и список сохраняют порядок вставки.

Из этого я экстраполирую, что если у меня есть Dictionary<double, double> foo который определяет кривую, foo.Keys.ToList() и foo.Values.ToList() даст мне упорядоченный список области действия и области этой кривой не возиться с этим?

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

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