Почему в .net нет общей реализации OrderedDictionary?

26

Почему Microsoft не предоставила универсальную реализацию OrderedDictionary?

Я видел несколько пользовательских реализаций, включая: http://www.codeproject.com/KB/recipes/GenericOrderedDictionary.aspx

Но почему Microsoft не включила его в базовую библиотеку .net? Конечно, у них была причина не создавать универсальный .... но что это?

До публикации этого сообщения я видел: /programming/2629027/no-generic-implementation-of-ordereddictionary

Но это только подтверждает, что его не существует. Не почему это не существует.

Благодарность

nonot1
источник
2
Всегда есть SortedDictionary<TKey, TValue>: msdn.microsoft.com/en-us/library/f7fta44c.aspx
Трэвис Гокель
2
Если я не понимаю документы SortedDict, это не то, что я хочу. Я не хочу никакой сортировки. Я просто хочу массив, к которому я также могу получить доступ по ключу. Во всяком случае, мне действительно интересно, почему MS пропустил это. (Тонкие вопросы и т. Д.)
nonot1
Каков типичный вариант использования упорядоченного словаря? Я изо всех сил пытаюсь думать об одном из головы.
Carson63000
1
@Carson каждый раз, когда у вас есть массив элементов данных, к которому вам также нужен быстрый произвольный доступ. Для простого сохранения в Dict теряется информация о заказе, а использование массива требует от вас поддерживать свой собственный индекс.
nonot1
2
Попросите Эрика Липперта прочитать и ответить на ваш вопрос. Он обычно очень рад помочь с этим типом вопроса. Я думаю, что вы можете связаться с ним через его блог: blogs.msdn.com/b/ericlippert
devuxer

Ответы:

17

В C # 4.0 В двух словах я читал это:

  1. Ан OrderedDictionaryявляется комбинацией HashTableиArrayList
  2. Там нет общего ArrayList
  3. «Неуниверсальный ArrayListкласс используется главным образом для обратной совместимости с Framework 1.x ...»
  4. « ArrayListФункционально похож на List<object>»
  5. «Отражение легче с неуниверсальным, ArrayListчем с List<object>»

Вывод?

Нет универсального, OrderedDictionaryпотому что его базовая конструкция является (неофициально) обесцененным классом, который не имеет самой универсальной версии.

radarbob
источник
4
Это на самом деле не отвечает на вопрос. Универсальный OrderedDictionary, очевидно, может быть построен на универсальном словаре и универсальном списке.
JacquesB
Одним из правил использования классов является то, что если пользовательский интерфейс не изменится, кто заботится о реализации? Ну, скажем, команда разработки языка / компилятора может предпочесть универсальное наследование своего неуниверсального аналога . Мой паучий смысл поражает. Для начала: Являются ли разные (непосредственные) предки наземной миной где-то на эволюционном пути для OrderedDictionaryковариации и противодействия?
радаробоб
15

В OrderedDictionaryперегруженной операции индексации , так что индексация с целым числом Nбудет получить элемент в положении N, при индексировании с Objectизвлечет элемент coresponding к этому объекту. Если бы можно было создать OrderedDictionary<int, string>под названиемmyDict и добавить элементы (1, «Джордж») и (0, «Фред») в этом порядке, должно myDict[0]возвращаться «Джордж» или «Фред»?

Такая проблема могла быть решена путем наложения ограничения класса на тип ключа. С другой стороны, большая часть полезности универсальных коллекций проистекает из их способности эффективно работать с типами значений. Наложение ограничения класса на тип ключа может показаться немного уродливым.

Если класс не должен был быть CLS-совместимым, а просто должен был работать с vb.net, разумный дизайн мог бы использовать именованные индексированные свойства. Таким образом, в приведенном выше примере, myDict.ByKey[0]получилось бы «Фред», и myDict.BySequence[0]уступил бы «Джордж». К сожалению, такие языки, как C #, не поддерживают именованные индексированные свойства. В то время как можно было бы кое-что добавить, чтобы разрешить использование вышеупомянутого синтаксиса даже без таких свойств, неудачное решение обернуть поля структур, таких как Pointи , но вместо этого изменить коллекцию, на которую он ссылается).Rectangle означает, что для myDict.ByKey[0] = "Wally"работы myDict.ByKeyпридется вернуть новый объект класса. Структура была бы более эффективной, но компиляторы отклоняли бы то, что выглядело как запись в структуру только для чтения (несмотря на то, что свойство не изменило бы структуру, возвращаемуюByKey

Лично я думаю, что было бы неплохо иметь объект dictionary-ish, который был задан как отслеживающий порядок вставки; Я также хотел бы иметь объект dictionary-ish, который мог бы легко вернуть ключ, связанный с конкретным ключом (например, если у вас есть словарь без учета регистра и добавлена ​​запись с ключом "GEORGE", может спросить у словаря, какой ключ связан с «Джорджем» без необходимости поиска по всем KeyValuePairобъектам, возвращенным в перечислении.

Supercat
источник
3

Потому что поддержание порядка предотвращает поиск O (1), который подразумевает IDictionary, если вы не оберните две коллекции (одну для порядка, одну для поиска), что делает добавление / удаление менее производительным и увеличивает использование памяти. Или вы могли бы иметь более медленный поиск в обмен на меньшее использование памяти.

Я предполагаю, что здесь не было «явно лучшего» выбора, поэтому он не вошел в стандартную библиотеку. Особенно в 2.0, C # все еще учился на ошибках Java. Я не удивлюсь, если бы подход Java «все и кухонная раковина» к коллекциям в их стандартной библиотеке также рассматривался как нечто, чего следует избегать.

Telastyn
источник
1
Имея более медленный просмотровые в обмен на меньше памяти только эффективно делает OrderedDictionaryA List. Я полагаю, что любой, у кого есть законный вариант использования для, OrderedDictionaryиспользует его специально, потому что им нужен класс коллекции, который имеет поиск O (1), но также помнит порядок вставки, и в этом случае использование дополнительной памяти неизбежно и, следовательно, приемлемо.
Abion47