Сохраняющие порядок структуры данных в С#
MSDN не имеет информации о свойствах структур данных, сохраняющих порядок. Итак, я сделал предположение, что:
- HashTable и HashSet не сохраняют порядок вставки (т.е. "Хэш" в этом случае - дешевая распродажа)
- Словарь и список сохраняют порядок вставки.
Из этого я экстраполирую, что если у меня есть Dictionary<double, double> foo
который определяет кривую, foo.Keys.ToList()
и foo.Values.ToList()
даст мне упорядоченный список области действия и области этой кривой не возиться с этим?
Ответы
Ответ 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, но если это произойдет, ваш автоматизированный тест обнаружит ее, и вы можете заменить словарь другим контейнером в это время, правильно?